Domanda

I have the following C function with a variable number of arguments, which is supposed to search the char* word through a hashtable and write true or false in a file which, if specified, is the second parameter; otherwise, it is stdout.

It works fine if I specify the name of the file, the problem is when I don't (e.g. find("foo")). In this case it writes the result in a file named foo instead of stdout.

What is the cause?

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");
}

In place of <condition> I've tried fname != NULL and strlen(fname) > 0 but those don't apply and it keeps seeing fname as word when fname is not specified.

Thank you very much for any help you can provide.

È stato utile?

Soluzione

From va_*'s man page:

If there is no next argument, or if type is not compatible with the type of the actual next argument (as promoted according to the default argument promotions), random errors will occur.

If you want to use a variable parameter list, you need to devise some sort of terminator for the list (e.g., always add a dummy NULL argument):

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

or supply the number of parameter as parameter:

find (1, word);
find (2, word, filename);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top