web-dev-qa-db-fra.com

fgets () inclut la nouvelle ligne à la fin

fgets(input,sizeof(input),stdin);
if (strcmp(input, "quit") == 0){
  exit(-1);
}

Si je tape quit, cela ne ferme pas le programme; Je me demande pourquoi c'est le cas.

Au fait, input est déclaré en tant que char *input;.

9
Man Person

Trailer la nouvelle ligne dans votre entrée. Voir homme fgets . Testez "quit" + newline, par exemple:

fgets(input,sizeof(input),stdin);
if(strcmp(input, "quit\n") == 0){
    exit(-1);
}

J'ai complètement manqué la dernière phrase, re char *input. Selon l'architecture, input sera long de 4 ou 8 octets. Donc, le code est effectivement

fgets(input, 8, stdin);

qui ne reflète pas la taille réelle de la mémoire, input pointe sur. Cela pourrait "fonctionner" tant que l'entrée est plus courte que huit octets, mais tronquera l'entrée si elle est plus grande. De plus, vous obtiendrez le reste de l'entrée la prochaine fois que vous appelez fgets.

Vous devez soit donner la taille réelle soit suivre les conseils de @ JonathanLeffler et déclarer un tableau de caractères à la place, par exemple.

char input[64];
fgets(input, sizeof(input), stdin);

ou 

char *input = malloc(N);
fgets(input, N, stdin);
8
Olaf Dietsche

La fonction fgets peut ajouter une nouvelle ligne à la fin de la chaîne lue. Vous devrez vérifier que:

size_t ln = strlen(input) - 1;
if (input[ln] == '\n')
    input[ln] = '\0';

ou même

strtok(input, "\n");
13
codaddict

Vous suggérons de coder ceci comme suit:

if(strstr(input, "quit") != NULL){

Raison: Cela résoudra le problème des personnes ajoutant des caractères supplémentaires (par exemple, un espace avant ou après le texte).

0