Simple c scanf ne fonctionne pas? [dupliquer]
cette question a déjà une réponse ici:
Si je, essayez quelque chose comme:
int anint;
char achar;
printf("nEnter any integer:");
scanf("%d", &anint);
printf("nEnter any character:");
scanf("%c", &achar);
printf("nHellon");
printf("nThe integer entered is %dn", anint);
printf("nThe char entered is %cn", achar);
il permet d'entrer un entier, puis saute la seconde scanf
complètement, c'est vraiment étrange, comme quand j'échange les deux (le char
scanf d'abord), il fonctionne très bien. Ce qui sur terre pourrait être mal?
5 réponses
lors de la lecture de l'entrée en utilisant scanf
, l'entrée est lue après la touche de retour est pressé , mais la nouvelle ligne générée par la touche de retour n'est pas consommé par scanf
, ce qui signifie la prochaine fois que vous lisez un char
de l'entrée standard il y aura une nouvelle ligne prête à être lu.
une façon d'éviter est d'utiliser fgets
pour lire l'entrée comme une chaîne de caractères et puis extraire ce que vous voulez en utilisant sscanf
comme:
char line[MAX];
printf("\nEnter any integer:");
if( fgets(line,MAX,stdin) && sscanf(line,"%d", &anint)!=1 )
anint=0;
printf("\nEnter any character:");
if( fgets(line,MAX,stdin) && sscanf(line,"%c", &achar)!=1 )
achar=0;
un autre façon de consommer la newline serait à scanf("%c%*c",&anint);
. Le %*c
Lira la nouvelle ligne du buffer et la rejettera.
, Vous pourriez vouloir lire ceci:
C FAQ : Pourquoi tout le monde dit de ne pas utiliser scanf?
les autres réponses sont correctes - %c
ne saute pas les espaces. La façon la plus simple de le faire est de placer whitespace avant le %c
:
scanf(" %c", &achar);
(N'importe quel espace dans la chaîne de format fera scanf
consommer tous les espaces consécutifs).
il ne saute pas le deuxième scanf()
; le deuxième scanf()
lit la nouvelle ligne laissée par le premier scanf()
. La plupart des codes de format sautent l'espace blanc; le format %c
ne saute pas l'espace blanc.
essayez aussi _flushall() après chaque appel printf. . Fondamentalement, par défaut, le flux de sortie c++ DE MS est amorti et le flux de sortie se vide.
appelant getchar()
avant scanf
purgera également la rupture de ligne stockée. Plus léger mais plus situationnel
char input_1;
char input_2;
getchar();
scanf("%c", &input_1);
getchar();
scanf("%c", &input_2);
va purger les ruptures de ligne, plus utile dans les lignes de code consécutives où vous savez que c'est seulement une valeur de file d'attente et pas une chaîne