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?

49
demandé sur Peter Mortensen 2011-03-09 05:56:02

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 .

43
répondu Jeremiah Willcock 2018-04-20 00:33:07

utiliser scanf(" %c", &c2); . Cela permettra de résoudre votre problème.

23
répondu Shweta 2017-10-27 01:43:32

utilisez getchar() avant d'appeler le second scanf() .

scanf("%c", &c1);
getchar();  // <== remove newline
scanf("%c", &c2);
1
répondu Jiwon 2018-08-03 13:52:13