scanf () laisse le nouveau caractère dans le tampon

J’ai le programme suivant:

int main(int argc, char *argv[]) { int a, b; char c1, c2; printf("Enter something: "); scanf("%d",&a); // line 1 printf("Enter other something: "); scanf("%d", &b); // line 2 printf("Enter a char: "); scanf("%c",&c1); // line 3 printf("Enter another char: "); scanf("%c", &c2); // line 4 printf("Done"); // line 5 system("PAUSE"); return 0; } 

Comme je l’ai lu dans le livre C, l’auteur dit que scanf() laissé un nouveau caractère de ligne dans le tampon. Par conséquent, le programme ne s’arrête pas à la ligne 4 pour que l’utilisateur entre les données. et passe à la ligne 5.

Est-ce correct?

Cependant, cela ne se produit-il qu’avec les types de données char ? Parce que je n’ai pas vu ce problème avec les types de données int comme à la ligne 1, 2, 3. Est-ce exact?

La fonction scanf() supprime automatiquement les espaces avant d’essayer d’parsingr les conversions autres que les caractères. Les formats de caractères (principalement %c ; les ensembles d’parsing %[…] – et %n ) constituent l’exception. ils ne suppriment pas les espaces.

Utilisez " %c" avec un espace vide pour ignorer les espaces blancs facultatifs. N’utilisez pas un blanc de fin dans une chaîne de format scanf() .

Notez que cela ne consum toujours aucun espace blanc restant dans le stream d’entrée, même pas à la fin d’une ligne, alors faites attention à cela si vous utilisez également getchar() ou fgets() sur le même stream d’entrée. Nous faisons simplement en sorte que scanf ignore les espaces avant les conversions, comme pour %d et les autres conversions sans caractère.


Notez que les “directives” autres que les espaces (pour utiliser la terminologie scanf de POSIX ) autres que les conversions, comme le texte littéral dans scanf("order = %d", &order); ne saute pas non plus les espaces. L’ order littéral doit correspondre au prochain caractère à lire.

Donc, vous voulez probablement " order = %d" si vous voulez ignorer une nouvelle ligne de la ligne précédente tout en exigeant une correspondance littérale sur une chaîne fixe, comme cette question .

Utilisez scanf(" %c", &c2); . Cela résoudra votre problème.

Utilisez getchar() avant d’appeler le second scanf() .

 scanf("%c", &c1); getchar(); // <== remove newline scanf("%c", &c2);