2013-06-25 2 views
0

Je veux tester si une chaîne que j'ai lu avec fgets() est "nouveau" ou "répéter". Si c'est répété, cela fonctionne comme il se doit, mais si c'est "nouveau" cela ne fonctionne pas. Quelqu'un sait pourquoi?strcmp avec fgets ne fonctionne pas comme il se doit

char repeatornew[7]; 
    fgets(repeatornew,7,stdin); 
    if(strcmp("repeat",repeatornew) == 0) 
    { 
     puts("repeat it."); 
    } 
    else 
    { 

     if(strcmp("new",repeatornew) == 0) 
     { 
      puts("new."); 
     } 
     else 
     { 
      printf("Please repeat the input! \n"); 

     } 
    } 
+1

Définir "ne fonctionne pas". –

+0

Si je tape "repeat", il met ("repeat it."); mais si je tape "new" if does printf ("Veuillez répéter l'entrée! \ n!); Donc strcmp (" new ", repeatornew) n'est jamais 1 même quand je tape new – Peter

+0

@ user2514164 Si vous tapez" repeat "Votre programme lira aussi la nouvelle ligne produite lorsque vous appuyez sur la touche Entrée, ainsi votre programme se répète \ n. Le dernier \ n peut être lu la prochaine fois si vous ne le lisez pas avec le premier appel de fgets() Et pensez à la place qu'il y a dans votre tableau, quand cela arrive, il y a peut-être de la place pour le \ n si vous entrez "new \ n") – nos

Répondre

5

Le comportement de fgets() est:

Reads au plus count - 1 caractères du flux de fichier donné et les stocke dans str. La chaîne de caractères produite est toujours terminée par NULL. L'analyse s'arrête si la fin du fichier se produit ou si un caractère de retour à la ligne est trouvé, auquel cas str contiendra ce caractère de retour à la ligne.

Si "repeat" est entré repeatornew ne contient pas le caractère de nouvelle ligne car il a place que pour 6 caractères plus le caractère nul final. Si "new" est entré alors repeatornew contiendra le caractère de nouvelle ligne et le strcmp() échouera.

Pour confirmer ce comportement imprimer le contenu de repeatornew après la fgets():

if (fgets(repeatornew,7,stdin)) 
{ 
    printf("[%s]\n", repeatornew); 
} 

Pour corriger, augmenter la taille du tableau repeatornew et comprennent le caractère de nouvelle ligne dans la chaîne littéraux pour comparision ou supprimer le caractère de nouvelle ligne à partir du tableau repeatornew s'il est présent.

+0

ok ça a marché! Thx! – Peter

Questions connexes