2016-10-17 4 views
0

Je suis en train de recueillir les commentaires de stdin en utilisant fgets utilisant un tableau de caractères avec une taille de 128 qui est censé arrêter quand il lit « sortie » mais il n'a pasC-fgets() à l'aide ne fonctionne pas stdin

char cmd[128]; 

if(fgets(cmd,128,stdin)=="exit"){ 
    //stuff 
    } 
+0

essayé avec un printf ("% s", cmd); using la sortie et il imprime vraiment la sortie sans au lieu de se terminer – Pyrromanis

+1

Copie possible de [Chaîne C - Utilisation de l'opérateur d'égalité == pour comparer deux chaînes pour l'égalité] (http://stackoverflow.com/questions/3933614/c-string-using -equality-operator-for-comparison-two-strings-for-égalité) –

Répondre

3

Vous ne pouvez pas comparer les chaînes avec l'opérateur ==. Ce que vous êtes en train de faire ici compare la valeur de retour de la fonction (l'adresse de cmd en cas de succès, NULL en cas d'échec) à l'adresse de la chaîne littérale "exit". Cela ne sera jamais vrai.

Vous devriez vérifier la valeur de retour pour NULL, puis utilisez la fonction strcmp pour comparer cmd contre "exit":

if ((fgets(cmd,128,stdin)) != NULL && 
    (strcmp(cmd,"exit\n") == 0 || strcmp(cmd,"exit\r\n") == 0) { 
    ... 

Notez que la fonction fgets stocke une nouvelle ligne dans le tampon si l'on est lu, nous avons donc besoin pour ajouter cela à la chaîne à vérifier.

+0

Est-ce que 'strcmp' va s'arrêter dans le cas où' fgets' renverrait null? –

+1

Juste pour ajouter à cela, fgets va aussi lire un retour à la ligne dans le tampon, donc vous devez utiliser strncmp ou ajouter un retour à la ligne. –

+0

Vous auriez besoin de 'strncmp' car le retour de' fgets' aurait [probablement] un retour chariot (ie) 'exit \ n' contre' exit', donc il ne correspondra pas comme écrit –