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?

20
demandé sur sbi 2010-09-19 10:41:27

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?

23
répondu codaddict 2010-09-19 07:03:11

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

13
répondu caf 2010-09-19 09:15:41

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.

5
répondu Jonathan Leffler 2010-09-19 06:44:34

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.

0
répondu rkellerm 2010-09-19 09:21:58

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

0
répondu Dale Diaz 2015-03-05 01:03:01