2013-02-24 10 views
5

Mam następujących funkcji C o zmiennej liczbie argumentów, który ma przeszukać char* word poprzez hashtable i napisać true lub false w pliku, który, jeśli określony, jest drugim parametrem; w przeciwnym razie jest to stdout.Dziwne zachowanie funkcji o zmiennej liczbie parametrów w C

Działa dobrze, jeśli określę nazwę pliku, problem występuje wtedy, gdy tego nie robię (np. find("foo")). W takim przypadku zapisuje wynik w pliku o nazwie foo zamiast stdout.

Jaka jest przyczyna?

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

W miejsce <condition> Próbowałem fname != NULL i strlen(fname) > 0 ale te nie mają zastosowania i utrzymuje widząc fnamefname jako word gdy nie jest określona.

Dziękuję za pomoc.

+1

varargs nie powinny być używane w ten sposób. Lepiej jest użyć 'void find (char * word, char * filename)' i sprawdzić czy 'filename' ma wartość' NULL', a jeśli tak, to napisz na stdout. Nie zapomnij również zamknąć pliku, otworzyłeś, jeśli otworzyłeś plik. –

Odpowiedz

6

Od strony człowieka va_* „s:

Jeśli nie ma następnego argumentu, lub jeśli typ nie jest zgodny z typem rzeczywistego następnego argumentu (promowane zgodnie z domyślnym argumentu promocje), losowe błędy wystąpią.

Jeśli chcesz użyć zmiennej listę parametrów, trzeba opracować jakiś terminator na liście (np zawsze dodać obojętne NULL argument):

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

lub dostarczania liczby parametr jako parametr:

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

OK, dzięki za zapamiętanie mnie. Działa z NULL na końcu listy. Początkowo myślałem, że NULL (lub inne zachowanie) było w jakiś sposób implikowane dla argumentów, które nie zostały odebrane, ale nie wie, kiedy kończy się lista. – thehousedude

Powiązane problemy