14 votes

Pourquoi le deuxième scanf() ne s'exécute-t-il pas

Je tente d'exécuter ce bloc de code.

#include  
int main(void)
{       

     printf("Commencer ici\n");
     int e, f, g, h;

     scanf("%d,%d", &e, &f);
     scanf("%d, %d", &g, &h);

     printf("%d %d %d %d", e, f, g, h);
}

Lorsque je saisis 2,0 ou quelque chose qui correspond à la chaîne de format dans le premier scanf(), le deuxième scanf() s'exécute également.

Cependant, si je saisis quelque chose comme 2-0 dans le premier scanf(), le programme saute le deuxième scanf() et passe directement au printf()

Par exemple, voici l'entrée et la sortie d'une exécution d'échantillon du programme. La deuxième ligne est l'entrée.

Commencer ici
1-2  
1 0 -2 -856016624u

Remarquez comment le programme a complètement sauté le deuxième scanf() et est allé directement au printf(). Pourquoi le deuxième scanf() est-il sauté ici?

21voto

Peter G Points 2093

La chaîne de format de scanf prend en compte également les spécificateurs non formatés qui s'y trouvent. Lorsque vous écrivez "1-2", le premier scanf va lire "1", puis chercher une virgule. Comme il n'en trouve pas, il abandonnera. Ensuite, le second scanf va voir "-2" puis chercher une virgule. Comme il n'en trouve pas, il abandonnera.

Le résultat final est que les deux autres variables ne seront pas initialisées et finiront par contenir n'importe quelles valeurs résiduelles dans leur emplacement mémoire au moment de l'exécution.

Vous pouvez éviter cela en vérifiant la valeur de retour de scanf. Cela vous dira combien de valeurs il a trouvées. Essayez ceci :

#include  
int main(void)
{       

     printf("Début du programme\n");
     int e, f, g, h;

     if (scanf("%d,%d", &e, &f) != 2) { /* gestion d'erreur */ }
     if (scanf("%d, %d", &g, &h) != 2) { /* gestion d'erreur */ }

     printf("%d %d %d %d", e, f, g, h);
}

2voto

Rxmsc Points 927

Supprimez une virgule entre les deux spécificateurs de format.

scanf("%d %d", &e, &f); // Supprimez la virgule dans le premier argument de scanf
scanf("%d %d", &g, &h);  // Supprimez la virgule dans le premier argument de scanf
        ^^^
      Supprimez la virgule entre les deux nombres

Parce que scanf ne saute que les espaces blancs et la virgule n'est pas un espace blanc.

En réalité, ce qui se passe lorsque vous demandez à scanf de lire des données numériques, c'est qu'il saute d'abord tout espace blanc qu'il trouve, puis il lit des caractères jusqu'à ce que le caractère lu ne puisse pas faire partie d'un nombre.

Dans ce cas, lorsqu'il rencontre la virgule, il arrête la lecture. Comme il n'a pas lu de chiffres, il n'y a pas de nombre à stocker, il laisse donc simplement la valeur d'origine.

1voto

Bidisha Pyne Points 447

Dans votre code, scanf("%d, %d",&e,&f) est de cette manière, donc vous devriez donner votre entrée comme : 1,2 ou 2,3 etc

Si vous voulez que votre entrée soit donnée comme 0-2 ou 2-4, alors votre scanf doit être comme ceci : scanf("%d-%d",&e,&f).

De cette façon, cela ne sera pas sauté.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X