Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
comp.lang.c常见问题解答中的错误?计算可变格式字符串的长度_C_String_Variadic Functions_Strlen - Fatal编程技术网

comp.lang.c常见问题解答中的错误?计算可变格式字符串的长度

comp.lang.c常见问题解答中的错误?计算可变格式字符串的长度,c,string,variadic-functions,strlen,C,String,Variadic Functions,Strlen,问题15.4: 在那里的示例代码中,他们似乎认为‍‍‍va_arg如果已到达列表末尾,则返回NULL: len = strlen(first); va_start(argp, first); while((p = va_arg(argp, char *)) != NULL) len += strlen(p); va_end(argp); 但是va_-arg的文档明确指出情况并非如此,而且va_-arg将愉快地走到列表的末尾 这与我尝试模拟上述代码并得到SEGFULT的经验相符。事

问题15.4:

在那里的示例代码中,他们似乎认为‍‍‍
va_arg
如果已到达列表末尾,则返回
NULL

len = strlen(first);

va_start(argp, first);

while((p = va_arg(argp, char *)) != NULL)
    len += strlen(p);

va_end(argp);
但是
va_-arg
的文档明确指出情况并非如此,而且
va_-arg
将愉快地走到列表的末尾


这与我尝试模拟上述代码并得到SEGFULT的经验相符。

事实上,
va_arg
没有提到在列表的nd处返回
NULL

如果没有下一个论点,或者 类型与类型不兼容 实际的下一个参数(如 根据默认值升级 参数升级),随机错误 将会发生

但常见问题是:

对vstrcat的调用类似于

char *str = vstrcat("Hello, ", "world!", (char *)NULL);

这意味着他们假设调用方将传递
NULL
作为的最后一个参数,以发出列表结束的信号。请注意,在中如何调用
vstrcat

char *str = vstrcat("Hello, ", "world!", (char *)NULL);

最后一个参数为NULL。这就是va_arg返回的内容,它们在调用vstrcat()时传递了一个空指针


-我认为没有读完整的文章是有道理的。每次我了解到C的一些新东西,一旦我不再抗拒,这种语言的美妙之处就更加明显了。对于将来偶然发现这条线索的任何人来说,这条评论是:如果你想自动添加NULL(假设你使用CPP作为你的编译器),你可以使用这样的宏:
#define myformatter(首先,…)myformatter_u3;(首先,##uuuu VA_uargs_uuuu,NULL)
应强制转换
NULL
。请重新阅读FAQ条目,并注意紧跟在每个人在答案中引用的位之后的句子。它明确地吸引了人们对演员阵容的注意,并链接到了对其原因的解释。
A call to vstrcat looks something like

    char *str = vstrcat("Hello, ", "world!", (char *)NULL);