2013-08-11 1 views
0

J'essaie d'obtenir une entrée de chaîne de l'utilisateur, puis exécuter différentes fonctions en fonction de l'entrée qu'ils ont entrée. Par exemple, dis-je j'ai demandé, "Quel est votre fruit préféré?" et je veux que le programme commente en fonction de ce qu'ils entrent ... Je ne suis pas sûr de savoir comment faire ça. Voici ce que j'ai jusqu'à présent:en utilisant fgets et strcmp dans C

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

char fruit[100]; 

main() { 
    printf("What is your favorite fruit?\n"); 
    fgets (fruit, 100, stdin); 
    if (strcmp(fruit, "apple")) { 
     printf("Watch out for worms!\n"); 
    } 
    else { 
     printf("You should have an apple instead.\n"); 
     } 

} 

Quand je lance le programme, peu importe ce que je rentre, il ne fait jamais l'instruction else.

Merci pour votre aide!

+0

'retours strcmp'' 0' (qui évaluera aussi faux) pour indiquer que les deux chaînes sont égales. –

+3

Est-ce que ** ** fait vraiment mal de lire la documentation des fonctions que vous essayez d'utiliser? –

+0

Aussi, n'utilisez pas 'main()' utilisez 'int main (void)' à la place. – 0decimal0

Répondre

3

Note deux choses dans votre code:

  1. fgets maintient la fuite '\ n'. le char associé dans le fruit devrait être remplacé par un '\ 0' avant de le comparer avec la chaîne "apple".
  2. strcmp return 0 lorsque deux chaînes sont identiques, donc la clause if doit être modifiée en fonction de ce que vous voulez dire (le fruit et "apple" sont équivalents dans la clause if)
  3. L'utilisation standard de la fonction C principale est int main(){ return 0;}

Le code révisé:

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

char fruit[100]; 

int main() { 
    printf("What is your favorite fruit?\n"); 
    fgets (fruit, 100, stdin); 
    fruit[strlen(fruit)-1] = '\0'; 
    if (strcmp(fruit, "apple") == 0) { 
     printf("Watch out for worms!\n"); 
    } 
    else { 
     printf("You should have an apple instead.\n"); 
    } 
    return 0; 
} 
+1

Ce qui précède est le bon, Parce que '\ n' est pris par fgets comme la fin de la chaîne alors remplacez-le par '\ 0' est correct. –

0

strcmp renvoie 0 si les entrées correspondent, une valeur> 0 si la gauche est "supérieure" à la droite, une valeur < 0 si la gauche est "inférieure" à la droite. Donc, généralement, vous voulez simplement tester l'égalité avec strcmp(...)==0. Mais il y a aussi la version intelligente: !strcmp(...). Même si vous n'utilisez pas ce style, il est utile d'apprendre à le reconnaître.

Et rappelez-vous que fgets ne supprime pas le caractère de nouvelle ligne '\n' de la chaîne.

+0

Il supprime si la longueur de la chaîne est 'arraysize-1'. – 0decimal0

+1

Même alors je ne dirais pas que le retour à la ligne est * enlevé *, mais peut-être * retenu * ou * en attente *. –

+1

J'aurais dû utiliser des guillemets autour de ** supprime **, ce n'est évidemment pas le bon mot ..... en fait il retient ''n'n''pas si la ficelle est assez petite pour qu'elle soit accommodée sinon elle ne l'est pas . – 0decimal0

1

Changer la condition if à ce qui suit:

if(strcmp(fruit,"apple") == 0) 

strcmp renvoie 0 chaînes si correspondance. Vous devriez toujours comparer le résultat avec l'opérateur ==