5

可変数の引数を持つ次のC関数があります。これはchar* word、ハッシュテーブルを検索して、指定されている場合は2番目のパラメーターであるファイルに書き込む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見え続けます。fnamewordfname

何卒よろしくお願い申し上げます。

4

1 に答える 1

6

va_*のマニュアルページから:

次の引数がない場合、または型が実際の次の引数の型と互換性がない場合 (デフォルトの引数の昇格に従って昇格されます)、ランダム エラーが発生します

可変パラメータ リストを使用する場合は、リストのターミネータを工夫する必要があります (たとえば、常にダミーの NULL 引数を追加します)。

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

または、パラメーターとしてパラメーターの数を指定します。

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