2011-06-15 70 views
3

我有一個簡單的參數列表。我只是想打印它到標準輸出,但我打印「結束」之前得到了有線輸出。有誰知道空行和無法讀取的字符來自哪裏?使用va_list打印參數列表

輸出:

start 
hello 
hello2 
hello3 
hello 4 

UH��AWAVAUATE1�S1�H��HH�E� 
end 



void printTest(const char* msg, ...) { 

    va_list ap; 
    int i; 
    const char* curMsg=0; 
    va_start(ap, msg); 
    printf("start\n"); 

    for(curMsg= msg ; curMsg!=0 ; curMsg = va_arg(ap, const char*)){ 
     printf("%s\n", curMsg); 
    } 
    printf("end\n"); 
    va_end(ap); 
} 



int main(){ 

    printTest("hello", "hello2", "hello3", "hello 4"); 
    return 0; 
} 

回答

5

你怎麼能指望看空指針終止循環,當你不及格呢?將呼叫更改爲:

printTest("hello", "hello2", "hello3", "hello 4", (char *)0); 
+0

是否有for循環的任何修復,而不是追加(char *)0? – Nissan911 2011-06-15 05:37:57

+0

來自文檔:如果沒有下一個參數,或者如果type與實際的下一個參數 (根據默認參數促銷推廣)的類型不兼容,則會發生隨機錯誤。我怎麼知道它是否到達最後? – Nissan911 2011-06-15 05:38:46

+1

不會。「隨機錯誤將會發生」是不準確的語言您正在閱讀的文檔使用的是替代**的行爲未定義**。您不允許在參數列表末尾調用'va_arg',並且**絕對沒有辦法**來標識參數列表的末尾,而不會以某種方式指示它。常見的方式是在末尾使用哨兵參數(如NULL)或指示參數數量和類型的格式字符串。 – 2011-06-15 12:24:02

4

va_list列表不是空終止的。實際上,它沒有提供任何關於有多少參數的信息。你的論據必須提供一些關於有多少參數的指示。例如,對於printf(),format參數指示要處理的附加參數的數量。

如果您需要列表以NULL結尾,則需要將NULL作爲最後一個參數。

+0

謝謝你瞭解了... – Nissan911 2011-06-15 05:39:55