2011-06-15 36 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