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);