2013-06-03 10 views
6

Próbuję napisać program, który porównuje podciąg, który użytkownik wprowadza z tablicą łańcuchów.Funkcja strstr()

#include <stdio.h> 
#include <string.h> 

char animals[][20] = { 
    "dogs are cool", 
    "frogs are freaky", 
    "monkeys are crazy" 
}; 

int main() { 
    char input[10]; 

    puts("Enter animal name: "); 
    fgets(input, sizeof(input), stdin); 

    int i; 
    for(i = 0; i < 3; i++) { 
     if(strstr(animals[i], input)) 
      printf("%s", animals[i]); 
    } 
    return 0; 
} 

Kiedy wchodzę żaby, na przykład należy wydrukować komunikat „żaby” dziwaczne, ale to nic nie drukuje.

Tak więc spróbowałem napisać wiersz, aby wydrukować wartość funkcji strstr() za każdym razem i wszystkie zwróciły 0, co oznacza, że ​​wszystkie porównania nie powiodły się. Nie rozumiem dlaczego, czy ktoś może mi pomóc?

Odpowiedz

7

Dzieje się tak, ponieważ twój ciąg zawiera znak nowej linii.

Z fgets documentation:

Znak nowej linii sprawia fgets przestać czytać, ale jest uważany za ważny znak przez funkcję i zawarte w łańcuchu skopiowanego do ul.

To powinno rozwiązać problem (demo):

#include <stdio.h> 
#include <string.h> 

char animals[][20] = { 
"dogs are cool", 
"frogs are freaky", 
"monkeys are crazy" 
}; 

int main() { 
    char input[10]; 

    printf("Enter animal name: "); 
    scanf("%9s", input); 

    int i; 
    for(i = 0; i < 3; i++) { 
     if(strstr(animals[i], input)) 
      printf("%s", animals[i]); 
    } 
    return 0; 
} 
5

fgets zawiera wejściowy znak nowej linii w buforze. Twoje struny nie mają w nich nic nowego, więc nigdy się nie dopasują.

5

Najprawdopodobniej fgets() zawiera znak nowej linii wprowadzany po naciśnięciu klawisza Enter. Usuń:

char *p = strchr(input, '\n'); 
if (p) 
    *p = 0; 
+0

'* p = 0; ==' '* p =„\ 0'' ?? –

+2

@mf_ yeah [15 znaków] –