scanf () laisse le nouveau char de ligne dans le buffer
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()
a laissé un nouveau caractère de ligne dans le tampon, donc, le programme ne s'arrête pas à la ligne 4 pour l'utilisateur d'entrer les données, il stocke plutôt le nouveau caractère de ligne dans c2 et se déplace à la ligne 5.
c'est ça?
cependant, cela n'arrive - t-il qu'avec les types de données char
? Parce que je n'ai pas vu ce problème avec int
types de données comme dans la ligne 1, 2, 3. Est-il juste?
3 réponses
la fonction scanf()
supprime automatiquement les espaces blancs avant d'essayer de parser les conversions autres que les caractères. Les formats de caractères (principalement %c
; aussi %[…]
- et %n
) sont l'exception; ils ne suppriment pas les espaces.
utilisez " %c"
avec un blanc de tête pour sauter l'espace blanc optionnel. Ne pas utiliser de blanc dans une chaîne de format scanf()
.
Notez que cela ne consomme toujours aucun espace de fuite laissé dans le flux d'Entrée, pas même à la fin d'une ligne, donc méfiez-vous de cela si vous utilisez également getchar()
ou fgets()
sur le même flux d'entrée. Nous sommes en train de faire passer scanf sur les conversions avant , comme il le fait pour %d
et d'autres conversions de non-caractère.
noter que Non-whitespace "directives "(pour utiliser la terminologie POSIX scanf ) autres que les conversions, comme le texte littéral dans scanf("order = %d", &order);
ne saute pas non plus whitespace. Le littéral order
doit correspondre au prochain caractère à lire.
donc vous voulez probablement " order = %d"
si vous voulez sauter une nouvelle ligne de la ligne précédente, mais encore exiger une correspondance littérale sur une chaîne fixe, comme cette question .
utiliser scanf(" %c", &c2);
. Cela permettra de résoudre votre problème.
utilisez getchar()
avant d'appeler le second scanf()
.
scanf("%c", &c1);
getchar(); // <== remove newline
scanf("%c", &c2);