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

the*_*ude 5 c arguments stdout list 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");
}
Run Code Online (Sandbox Code Playgroud)

在地方的<condition>我试过fname != NULLstrlen(fname) > 0,但那些不适用,它让看到fnameword时候fname没有被指定.

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

LSe*_*rni 6

来自va_*的手册页:

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

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

find (word, NULL);
find (word, filename, NULL);
Run Code Online (Sandbox Code Playgroud)

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

find (1, word);
find (2, word, filename);
Run Code Online (Sandbox Code Playgroud)