我有以下带有可变数量参数的C函数,它应该通过哈希表搜索char* word
并在文件中写true
或false
,如果指定的话,是第二个参数;否则,它是stdout
。
如果我指定文件的名称,它可以正常工作,问题是当我不指定时(例如find("foo")
)。在这种情况下,它将结果写入名为foo
的文件而不是stdout
。
原因是什么?
void find(char* word, ...)
{
va_list list;
char *fname = NULL;
va_start(list, word);
FILE* f;
fname = strdup(va_arg(list, char*));
va_end(list);
if (<condition>) // condition suited for the case in which the file name is received
f = fopen(fname, "a");
else
f = stdout;
if (member(word))
fprintf(f, "True\n");
else
fprintf(f, "False\n");
}
代替<condition>
我已尝试过fname != NULL
和strlen(fname) > 0
,但这些不适用,fname
word
fname
{{1}} {{1}}未指定1}}。
非常感谢您提供的任何帮助。
答案 0 :(得分:6)
来自va_*
的手册页:
如果没有下一个参数,或者类型与之不兼容 实际下一个参数的类型(根据默认值提升) 参数促销),将发生随机错误。
如果要使用变量参数列表,则需要为列表设计某种终结符(例如,始终添加虚拟NULL参数):
find (word, NULL);
find (word, filename, NULL);
或提供参数数量作为参数:
find (1, word);
find (2, word, filename);