2014-12-31 14 views
6


Nessuna uscita nel terminale (Head First C)

mi stava attraversando alcuni esercizi dal libro Head First C. E c'è un programma jukebox.
Source è qui:

#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; 
} 

sto usando terminale per compilare e visualizzare output del programma con la versione di gcc 4.8.2 come:

gcc pr.c -o pr 

E ogni volta che provo a fare funzionare il programma e inserisci stringa di ricerca Non ottengo output. Il programma termina solo l'esecuzione e l'uscita.

Inoltre voglio menzionare che ho provato a compilare questo codice su ideone.com here.
Quali problemi potrebbero esserci? Il terminale non mostra affatto output.

+1

potrebbero esserci diversi problemi, quindi sarebbe meglio provare con il debug passo dopo passo e osservare il comportamento. Una prima ipotesi (con le mie abilità C molto arrugginite) potrebbe essere che stai inserendo solo la stringa sbagliata (non rispettando il sottotitolo per esempio). Forse dovresti provare con stringhe molto più semplici per evitare già quel tipo di errore possibile. –

+3

Wow. Descrizione completa del problema e anche un link a ideone. Giustamente le domande "aiutami a fare il debug" sono così rare in questi giorni. – luk32

+1

Peccato che sia un duplicato esatto. Il duplicato non ha una risposta corretta, ma la correzione proposta è buona. – usr2564301

risposta

7

fgets legge newline e lo inserisce nel buffer. Quindi la stringa che scrivi non viene mai trovata nell'array. Modificare il codice per sopprimere la nuova riga dopo l'immissione, in questo modo: search_for[strlen(search_for)-1]='\0';. Dovrebbe funzionare meglio.

+0

Si noti che quando si fa * solo * questo, è meglio assicurarsi di non riempire completamente il buffer o premere EOF. – usr2564301

+3

dovrebbe essere 'if (search_for [strlen (search_for) -1] == '\ n') search_for [strlen (search_for) -1] = '\ 0';' –

+1

Oh accetterò presto la tua risposta e voglio dite che questo è lo stesso identico codice sorgente del libro e non lo sapevo, quindi grazie mille! –

0

Inserire questo codice prima di chiamare la funzione.

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

Si otterrà l'output corretto.