C中参数数量可变的函数的奇数行为

时间:2013-02-24 09:29:24

标签: c list arguments stdout variable-length

我有以下带有可变数量参数的C函数,它应该通过哈希表搜索char* word并在文件中写truefalse,如果指定的话,是第二个参数;否则,它是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 != NULLstrlen(fname) > 0,但这些不适用,fname word fname {{1}} {{1}}未指定1}}。

非常感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:6)

来自va_*的手册页:

  

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

如果要使用变量参数列表,则需要为列表设计某种终结符(例如,始终添加虚拟NULL参数):

find (word, NULL);
find (word, filename, NULL);

或提供参数数量作为参数:

find (1, word);
find (2, word, filename);