【问题标题】:c print argument list using va_listc 使用 va_list 打印参数列表
【发布时间】:2011-06-15 05:26:42
【问题描述】:

我有一个简单的参数列表。我只想将它打印到标准输出,但在打印“结束”之前我得到了有线输出。有谁知道那个空行和不可读的字符是从哪里来的??

输出:

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

【问题讨论】:

    标签: c printf variadic-functions


    【解决方案1】:

    当你没有传递一个空指针来终止循环时,你希望如何读取它?将调用更改为:

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

    【讨论】:

    • 对于 for 循环是否有任何修复,而不是附加 (char*) 0?
    • 来自文档:如果没有下一个参数,或者类型与实际下一个参数的类型不兼容(根据默认参数提升),将发生随机错误。我怎么知道它是否到达终点??
    • 没有。 “将发生随机错误”是您正在阅读的文档使用的不精确的语言来代替 行为未定义。您不能在参数列表末尾调用va_arg,并且绝对没有办法在不以某种方式指出参数列表的末尾的情况下识别它。常见的方法是在末尾加上一个标记参数(如 NULL)或一个指示参数数量和类型的格式字符串。
    【解决方案2】:

    va_list 列表不是以 NULL 结尾的。事实上,它没有提供关于有多少参数的任何信息。你的论点必须提供一些关于有多少论点的指示。例如,对于 printf(),格式参数表示要处理的附加参数的数量。

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

    【讨论】:

      猜你喜欢
      • 2013-08-22
      • 2021-05-19
      • 2017-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      相关资源
      最近更新 更多