2016-11-19 113 views
0

中的ncurses printw函数这已被问到几种不同的口味。但我仍然无法实现它的工作。这是我的函数定义。正向变量参数列表在c

void                   
ncurses_add_line(const char *fmt, ...)           
{                    
    if (ncurses_window) {               
    va_list args;                
    va_start(args, fmt);              
    printw(fmt, args);               
    printw("\n");           
    va_end(args);                
    }                    
} 

当我调用这个函数时,我的函数中的可变参数输出中出现乱码。如果我直接拨打printw,它一切正常。例如,如果我打电话ncurses_add_line,比如ncurses_add_line("Hello %d", var),我得到的值不是var。但是,如果我拨打printw("Hello %d", var),我会看到“Hello”旁边显示的var的值,如果var == 1,那么“Hello 1”用printw打印,但ncurses_add_line不是这种情况。

我需要改变什么?

我的理由是因为我不想将头文件包含在我的c文件中。

回答

2

尝试vwprintw而不是printw。​​以va_list为参数。

您试图使用的习惯用法 - 将va_list传递给一个带有可变数量参数的函数 - 将不起作用。一种解决方案是找到可以工作的函数的变体(在这种情况下,vwprintw)。另一种方法是“压扁”va_list:在这种情况下,您可以使用vsprintf创建格式化的字符串,然后将其传递给curses。

1

args不是东西就像一个参数数组。这是一个内部结构。你必须通过传递类型来读出每一个参数。请记住,在C中没有运行时反射,因此您必须在代码中添加类型。

void ncurses_add_line(const char *fmt, ...)           
{                    
if (ncurses_window) 
{    
    va_list args; 
    va_start(args, fmt);  
    char *arg = va_arg(args, int); // take out one arg by giving the type (int) 
    printw(fmt, arg); 
    printw("\n");           
    va_end(args);                
    }                    
}