Question

I application console d'écriture qui exécute plusieurs scanf pour int Et après, je PERFORMs getchar:

int x,y;
char c;
printf("x:\n");
scanf("%d",&x);
printf("y:\n");
scanf("%d",&y);
c = getchar();

à la suite de ce que je reçois c = '\n', malgré l'entrée est:

1
2
a

Comment ce problème peut être résolu?

Était-ce utile?

La solution

Ceci est parce que scanf quitte la nouvelle ligne que vous tapez dans le flux d'entrée. Essayez

do
    c = getchar();
while (isspace(c));

au lieu de

c = getchar();

Autres conseils

Vous pouvez utiliser la fonction fflush à quoi que ce soit clair laissé dans un tampon comme consquence des entrées précédentes de ligne COMAND:

fflush(stdin);

Une façon de nettoyer anyspace avant votre personnage désiré et ignorer les caractères restants est

do {
    c = getchar();
} while (isspace(c));
while (getchar() != '\n');

Pour commencer la scanf doit se lire scanf("%d\n", &x); ou y. Cela devrait faire l'affaire.

homme scanf

Appel fflush(stdin); après scanf pour rejeter tous les caractères inutiles (comme \ r \ n) à partir du tampon d'entrée qui ont été laissés par scanf.

Edit: Comme les gars dans les commentaires mentionnés solution fflush pourrait avoir problème de la portabilité, donc voici ma deuxième proposition. Ne pas utiliser scanf du tout et faire ce travail en utilisant la combinaison de fgets et sscanf. Cela est beaucoup plus simple approche plus sûre et, car la gestion des situations permettent d'entrée erronées.

int x,y;
char c;
char buffer[80];

printf("x:\n");
if (NULL == fgets(buffer, 80, stdin) || 1 != sscanf(buffer, "%d", &x))
{
    printf("wrong input");
}
printf("y:\n");
if (NULL == fgets(buffer, 80, stdin) || 1 != sscanf(buffer, "%d", &y))
{
    printf("wrong input");
}
c = getchar();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top