2016-11-19 116 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);                
    }                    
}