5

我有以下带有可变数量参数的 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 != NULLstrlen(fname) > 0但那些不适用,并且它一直看到fname没有指定的word时间。fname

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

4

1 回答 1

6

va_*的手册页:

如果没有 next 参数,或者 type 与实际 next 参数的类型不兼容(根据默认参数提升),则会发生随机错误

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

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

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

find (1, word);
find (2, word, filename);
于 2013-02-24T09:56:12.147 回答