lire omble chevalier de la console
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?
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.
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();