lire les caractères à partir de la console
J'écris application console qui effectue plusieurs scanf pour int
Et après ça ,j'effectue getchar :
int x,y;
char c;
printf("x:\n");
scanf("%d",&x);
printf("y:\n");
scanf("%d",&y);
c = getchar();
la suite de cela je reçois c = '\n'
,en dépit de l'entrée est:
1
2
a
Comment ce problème peut être résolu?
getchar()
retourne int
, pas char
.le caractère suivant à partir de l'entrée standard (stdin)."-ascii pour char
OriginalL'auteur Yakov | 2012-01-13
Vous devez vous connecter pour publier un commentaire.
C'est parce que
scanf
quitte le retour à la ligne que vous tapez dans le flux d'entrée. Essayezau lieu de
OriginalL'auteur Fred Foo
Un moyen de nettoyer les anyspace avant votre caractère et ignorer le reste des caractères est
OriginalL'auteur Josué
Vous pouvez utiliser la fonction fflush pour effacer tout ce qui restera dans la mémoire tampon d'une consquence de la précédente comand entrées ligne:
fflush(stdin)
invoque un Comportement non défini par la norme C bien qu'il est bien définie sur certains systèmes implémentations), mais il est préférable de l'éviter afin d'améliorer la portabilité.OriginalL'auteur ETFovac
Pour commencer, la
scanf
devrait lirescanf("%d\n", &x);
ou y. Cela devrait faire l'affaire.l'homme scanf
t work :after I enter 1 it doesn
t écrire "y:"(voir la mise à jour exemple),mais attend le deuxième numéro et seulement après, il écrit: "y:"OriginalL'auteur Ed Heal
Appel
fflush(stdin);
aprèsscanf
pour éliminer tous les caractères inutiles (comme \r \n) à partir de la mémoire tampon d'entrée qui ont été laissés par lesscanf
.Edit: Comme les gars dans les commentaires mentionnés
fflush
solution pourrait avoir la portabilité de la question, donc voici ma deuxième proposition. Ne pas utiliserscanf
à tous et de faire ce travail à l'aide de la combinaison defgets
etsscanf
. Ce est beaucoup plus sûr et plus simple, parce que de permettre la manipulation entrées mauvaises situations.fflush(stdin)
n'est pas défini. Même Microsoft/MSDN (qui définit une telle construction) dit (bien que dans un endroit caché) c'est une extension: "// fflush sur les flux d'entrée est une extension du C standard".Vrai! (Même que j'ai tendance à remarquer de temps en temps). Cela vient un peu sur., mais il MSDN supports (lien de la page) et donc ne Linux...
"For input streams, fflush() discards any buffered data that has been fetched from the underlying file, but has not been consumed by the application...The standards do not specify the behavior for input streams. Most other implementations behave the same as Linux. "
...alors, comment le mauvais est à utiliser dans le code?Le texte à la POSIX.1-2008 date de la page c'est un peu différent: il ne mentionne pas l'application à tous. Je n'aime pas que POSIX.1-2008 date de description. Linux et Windows et POSIX (avec toutes les mises en garde) ne sont pas assez pour moi d'appeler portable.
aussi pourquoi tu as accepté de vous limiter à Linux et Windows et POSIX (avec toutes les mises en garde) quand vous pouvez très facilement rejoindre beaucoup plus implémentations?
Vous êtes certainement raison au sujet de la portabilité! Mais si je devais limiter cet appel dans mon de la mise en œuvre sur la plate-forme de soutien à dire Linux je pourrais très bien l'utiliser avec macro comme
#ifdef LINUX
(peut-être quelque chose comme l'utilisation d'extensions C de gcc lorsque cela est possible). Comme vous l'avez mentionné, il est préférable de s'en tenir aux normes. Merci pour vos idées!OriginalL'auteur Zuljin