2011-10-30 19 views
5

Perché questa particolare parte di codice restituisce false su strstr() se inserisco "test"?strstr non funziona

char input[100]; 

int main() 
{ 
    fgets(input, 100, stdin); 
    printf("%s", input); 

    if(strstr("test message", input)) 
    { 
     printf("strstr true"); 

    } 


} 

Ho pensato che strstr ha cercato il primo parametro per le istanze del secondo parametro? Funziona quando sostituisco l'input con del testo o semplicemente gli assegno qualcosa direttamente, ma sembra che non funzioni con Fgets.

+0

Per quanto riguarda il problema, c'è http://stackoverflow.com/questions/2693776/removing-trailing-newline-character-from-fgets-input –

risposta

10

È perché Fgets memorizza il carattere di nuova riga in modo che quando strstr esegue un confronto non riesce.

Dalla pagina man:

fgets() legge in al più una meno di caratteri di dimensioni dal flusso e li memorizza nel buffer puntato da s. La lettura si interrompe dopo un EOF o una nuova riga. Se una nuova riga viene letta, viene memorizzata nel buffer. A '\ 0' viene memorizzato dopo l'ultimo carattere nel buffer.

+0

Rimuovi probabilmente e ottieni +1 :) – FailedDev

+0

@sashang quella parte del documento è ancora confusa. Dice EOF o newline. Cos'è questo? Stavo facendo un tutorial e mi stava fallendo. Sostituire l'ultimo carattere con un '\ 0' nullo ha funzionato, ma il tutorial ha fatto sembrare che' fgets' mette automaticamente '\ 0' quando in effetti mette' \ n'. A causa di questo 'strstr' non funzionava. Ma allora perché il libro ha detto che avrebbe funzionato? – Andy

+0

@Andy: "EOF o newline" significa EOF o newline o entrambi. 'o' qui ha il significato del logico booleano oe 'o' che è usato nell'inglese colloquiale. Quindi entrambi sono una risposta valida. – sashang

6

Aggiungi input[strlen(input) - 1] = '\0'; dopo il fgets. fgets legge nel carattere di nuova riga ('\n'). Non c'è '\n' in "test message" quindi input non sarà mai contenuto al suo interno.

È necessario verificare se la nuova riga si trova alla fine del buffer dopo aver chiamato fgets per sapere se l'intera linea è stata effettivamente in grado di inserirla e anche per rimuoverla.

+0

presumo che quando 'fgets' legge, diciamo,' "Hello" ', in realtà legge' "Hello \ n \ 0" 'o' "Hello \ n" '. – Andy

+0

Legge '" Hello \ n "' e quindi termina la stringa con un ''\ 0''. Ma è solo se c'è un carattere di nuova riga da leggere. – AusCBloke

+0

Lasciami riformulare la domanda. Quale dovrebbe essere il risultato totale di 'fget'? Chiedo perché 'strstr' non funziona. Quando eseguo 'variable [strlen (variable) -1] = '\ 0'', funziona. Quando 'strlen' analizza la stringa per la lunghezza, salta il valore nullo terminante? Quindi "Hello \ n \ 0" ', è 6 perché include la nuova riga? E se è così, allora il risultato sarebbe '" Ciao \ 0 \ 0 "' se è come risolverei il mio problema che è un po 'dispendioso. Grazie per il tuo tempo, a proposito. – Andy