2017-06-05 6 views
0

J'apprends C à partir du livre Head First C, et j'ai essayé l'un des exemples, et malgré le fait d'avoir le même code, mon code ne fonctionnera pas comme l'exemple du livre. Le code vise à utiliser la fonction strstr() pour trouver une chaîne dans une autre chaîne, mais après avoir exécuté mon code, elle demande seulement mon entrée et affiche "Programme terminé avec le code de sortie: 0". Code:Fonction strstr() en programmation C

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

le résultat après l'exécution du code est:

Search for: (my input) 
Program ended with exit code: 0 

Aide!

+4

Quelle est votre contribution? – CIsForCookies

+0

Vous n'imprimez rien si la piste est introuvable. Peut-être que votre entrée n'est pas disponible dans 'pistes'? – CinCout

Répondre

2

Ce code est erroné; fgets lit une ligne complète, en laissant le caractère de nouvelle ligne dans le tampon cible (sauf si vous avez fourni exactement 79 caractères). Pour cette raison, find_track recherchera une chaîne avec une nouvelle ligne de fin, qui bien sûr ne peut être trouvée.

Une solution possible peut être de supprimer le dernier caractère de la chaîne d'entrée, juste après le fgets.

if(*search_for) search_for[strlen(search_for) -1] = 0; 

ou d'utiliser une fonction d'entrée différente, qui ne lit pas le retour à la ligne.

+0

Pourriez-vous m'aider à comprendre votre code? Je ne comprends pas ce que fait sa fonction (j'ai du mal à convertir ce code en anglais parlé) – QuantumDust

+0

'if (* search_for)' est une façon compacte de dire 'if (search_for [0]! = 0)', qui est un moyen de vérifier si la chaîne contient au moins un caractère (si une chaîne est de longueur nulle, le premier caractère doit être le terminateur NUL). 'search_for [strlen (search_for -1] = 0;' remplace le dernier caractère de la chaîne par le terminateur NUL, supprimant ainsi le dernier caractère (dans votre cas, le retour chariot de la chaîne) –

+0

Merci! Très complet – QuantumDust

2

Si votre entrée a été entrée avec un saut de ligne, fgets() inclut la nouvelle ligne dans la chaîne search_for résultante. D'autre part, si vous terminez votre entrée avec EOF (habituellement ctrl + D) alors il ne contient pas le retour à la ligne, et votre programme fonctionne comme prévu.

Vous trouverez des techniques pour éviter ce problème dans this question et ses réponses.

+0

jtbandes et Matteo Italia, vos deux méthodes fonctionnent! Merci – QuantumDust

0

recherche_pour [strlen (recherche_pour) -1] = 0; fgets (search_for, 80, stdin); Fgets() ajoute une nouvelle ligne

+3

Coin concern: Sans tester 'search_for [0]! = 0',' search_for [strlen (search_for) -1] 'est un hack exploitable si le premier caractère lu est un caractère_null_. – chux