c使用va_列表打印参数列表

c使用va_列表打印参数列表,c,printf,variadic-functions,C,Printf,Variadic Functions,我有一个简单的参数列表。我只想把它打印到标准输出,但我在打印“结束”之前会得到有线输出。有人知道空行和不可读字符来自哪里吗 输出: 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);

我有一个简单的参数列表。我只想把它打印到标准输出,但我在打印“结束”之前会得到有线输出。有人知道空行和不可读字符来自哪里吗

输出:

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;
}

当不传递空指针时,如何读取空指针来终止循环?将呼叫更改为:

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

va_列表不是以NULL结尾的。事实上,它没有提供关于有多少参数的任何信息。您的参数必须提供有多少个参数的指示。例如,对于printf(),format参数指示要处理的其他参数的数量


如果需要将列表以NULL结尾,则需要将NULL作为最后一个参数传递。

是否对for循环进行了修复,而不是从文档中附加(char*)0?如果没有下一个参数,或者如果类型与实际下一个参数的类型不兼容(根据默认参数升级),将发生随机错误。我如何知道它是否到达结尾??否。“将发生随机错误”是您正在阅读的文档所使用的不精确的语言,而不是未定义的行为。您不允许调用参数列表末尾的
va_arg
,并且如果不以某种方式进行指示,绝对无法识别参数列表的结尾。常见的方法是使用sentinel参数(如NULL)或指示参数数量和类型的格式字符串。