Différence entre scanf (“% c”, & c) et scanf (“% c”, & c)

Considérez l’extrait de code C suivant:

#include  int main() { int a; char c; scanf("%d",&a); scanf("%c",&c); printf("int=%d\n",a); printf("char=%c\n",c); } 

Je ne peux entrer que le nombre entier et non le caractère. La sortie est simplement la valeur entière et aucune valeur n’est sortie pour la deuxième instruction printf.

Cependant, si j’utilise un espace avant le spécificateur de format:

 scanf(" %c",&c); 

Cela fonctionne comme prévu. pourquoi est-ce le cas?

Quelqu’un m’a dit que cela avait quelque chose à voir avec l’effacement du tampon d’entrée. Quelqu’un pourrait-il faire la lumière sur la même chose?

La différence entre scanf("%c", &c1) et scanf(" %c", &c2) est que le format sans le blanc lit le caractère suivant, même s’il s’agit d’un espace blanc, alors que celui avec le blanc saute un espace blanc. (y compris les nouvelles lignes) et lit le caractère suivant qui n’est pas un espace blanc.

Dans un format scanf() , un blanc, un onglet ou une nouvelle ligne signifie “ignorer les espaces s’il en manque”. Il ne “nettoie pas directement le tampon d’entrée”, mais il occupe tout espace blanc ressemblant à l’effacement du tampon d’entrée (mais il est tout à fait distinct de celui-ci). Si vous utilisez Windows, utilisez fflush(stdin) effacer le tampon d’entrée (des espaces et des caractères non blancs); sous Unix et selon le standard C, fflush(stdin) est un comportement indéfini.

Incidemment, si vous avez saisi l’entier suivi immédiatement d’un retour chariot, la sortie de votre programme se termine par deux nouvelles lignes: la première était en c et la seconde dans la chaîne de format. Ainsi, vous avez peut-être vu:

 $ ./your_program 123 int=123 char= $ 

C’est-à-dire que scanf() lit la nouvelle ligne en tant qu’entrée. Considérons une entrée alternative:

 $ ./your_program 123xyz int=123 char=x $ 

L’entrée entière s’est arrêtée quand il a lu le ‘x’; l’entrée de caractère lit donc le «x».

Car après avoir entré le numéro et appuyé sur ENTREE, la nouvelle ligne rest dans la mémoire tampon et sera traitée par le second scanf .

En bref, vous avez enregistré une nouvelle ligne dans la variable c .

Cependant, si vous utilisez

 scanf(" %c",&c); // ^ 

l’espace utilisera la nouvelle ligne, ce qui fait de c la valeur attendue.

Vous devez passer un pointeur sur l’object de données spécifié par la chaîne de format, afin

 scanf("%c", c); 

passera effectivement la valeur de c, ce qui pourrait causer une erreur de programme,

 scanf("%c", &c); 

passera l’adresse de c, permettant à scanf de changer la valeur de votre copie.

L’espace après le% c le forcera à rechercher un personnage, ET ALORS un espace. S’il n’y a pas d’espace, il ne lira pas le caractère