2014-12-31 11 views
6


Brak wyjścia w terminalu (Head First C)

ja jechałem przez kilka ćwiczeń z książki Head First C. I jest jeden program jukeBox.
źródłowy jest tutaj:

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

char tracks[][80] = { 
    "I left my heart in Harvard Med School", 
    "Newark, Newark - a wonderful town", 
    "Dancing with a Dork", 
    "From here to maternity", 
    "The girl from Iwo Jima", 
}; 

void find_track(char search_for[]){ 
    int i; 

    for (i = 0; i < 5; i++) { 
     if (strstr(tracks[i], search_for)) 
      printf("Track %i: '%s'\n", i, tracks[i]); 
    } 
} 
int main(){ 
    char search_for[80]; 
    printf("Search for: "); 
    fgets(search_for, 80, stdin); 
    find_track(search_for); 

    return 0; 
} 

używam terminala do kompilowania i zobaczyć wyjście programu z wersji gcc 4.8.2 jak:

gcc pr.c -o pr 

A gdy próbuję uruchomić program i wpisz ciąg wyszukiwania, nie otrzymuję danych wyjściowych. Program tylko kończy wykonywanie i wychodzi.

Ponadto chciałbym wspomnieć, że próbowałem skompilować ten kod na ideone.com here.
Jakie problemy mogą wystąpić? Terminal nie wyświetla w ogóle żadnego wyjścia.

+1

może być kilka różnych problemów, więc lepiej jest wypróbować krok po kroku debugowanie i obserwować zachowanie. Pierwsze przypuszczenie (z moimi bardzo zardzewiałymi umiejętnościami C) może polegać na tym, że wprowadzasz niewłaściwy ciąg znaków (na przykład nie respektując literówki). Może powinieneś najpierw wypróbować wiele prostszych łańcuchów, aby uniknąć tego rodzaju możliwego błędu. –

+3

Wow. Pełny opis problemu, a nawet link do ideału. Odpowiednio zadawane pytania "pomóż mi debugować" są w dzisiejszych czasach tak rzadkie. – luk32

+1

Szkoda, że ​​to dokładny duplikat. Duplikat nie został poprawnie odebrany, ale proponowana poprawka jest dobra. – usr2564301

Odpowiedz

7

fgets odczytuje znak nowej linii i umieszcza go w buforze. Tak wpisany ciąg nigdy nie zostanie znaleziony w tablicy. Zmodyfikuj kod, aby ukryć nową linię po wprowadzeniu, na przykład: search_for[strlen(search_for)-1]='\0';. To powinno działać lepiej.

+0

Należy pamiętać, że robiąc * tylko * to, lepiej upewnij się, że nie wypełniasz całkowicie bufora lub naciśnij EOF. – usr2564301

+3

Powinno być 'if (search_for [strlen (search_for) -1] == '\ n') search_for [strlen (search_for) -1] = '\ 0';' –

+1

Och, przyjmuję twoją odpowiedź wkrótce i chcę powiedzieć, że jest to dokładnie ten sam kod źródłowy z książki i nie wiedziałem o tym, więc wielkie dzięki! –

0

Umieść ten kod przed wywołaniem funkcji.

search_for[strlen(search_for)-1]='\0'; 

Otrzymasz prawidłowe wyniki.

Powiązane problemy