9
votes

lire caractère de la console

i écrire une application de console qui effectue plusieurs scanaf pour int Et après cela, j'effectue getchar: xxx

à la suite de cela, je reçois c = '\ n' , malgré l'entrée est: < Pré> xxx

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


2 commentaires

getchar () retour int , pas char .


@unwind - "Retourne le caractère suivant de l'entrée standard (STDIN)." - ASCII pour char


5 Réponses :


12
votes

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

au lieu de xxx


0 commentaires

1
votes

pour un démarrage du scanf doit lire scanf ("% d \ n", & x); ou y ou y. Cela devrait faire l'affaire.

Man scanf


1 commentaires

Ça ne fonctionne pas: Après avoir entré 1, il ne pas écrire "Y: t écrire" Y: "(voir l'exemple mis à jour), mais attend le deuxième numéro et seulement après qu'il écrit" Y: "



2
votes

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

EDIT: Comme les gars dans les commentaires mentionnés fflush Solution pourrait avoir une question de portabilité, alors voici ma deuxième proposition. N'utilisez pas scanf du tout et faites ce travail à l'aide de la combinaison de fgets et sscanf . C'est une approche beaucoup plus sûre et plus simple, car il permet de manipuler de mauvaises situations d'entrée. xxx


9 commentaires

-1 fflush (stdin) n'est pas défini. Même Microsoft / MSDN (qui Définit une telle construction) dit (bien que dans un emplacement caché), il s'agit d'une extension: "// fflush on Stream est une extension de la norme C".


@PMG: True! (Même j'ai tendance à le pointer de temps en temps). Cela revient un peu., Mais il fonctionne MSDN prend en charge (vous avez lié la page) et aussi linux ... " pour les flux d'entrée, FFLUSH () rejette toutes les données tamponnées extraites du fichier sous-jacent, mais n'a pas été consommée par l'application. ... Les normes ne spécifient pas le comportement des flux d'entrée. La plupart des autres implémentations se comportent de la même manière que Linux. " ... Alors, quelle est la mauvaise utilisation du code?


Le texte sur le POSIX.1-2008 Page est légèrement différent: Cela ne mentionne pas du tout l'application. Je n'aime pas du tout ça POSIX.1-2008. Linux et Windows et Posix (avec toutes les mises en garde) ne sont pas suffisants pour que je puisse appeler portable.


@ Un autre.Anon.Coward: aussi Pourquoi vous limiteriez-vous volontiers à Linux et à Windows et à Posix (avec toutes les mises en garde) lorsque vous pouvez accélérer très facilement beaucoup plus de mises en œuvre?


@PMG: Vous avez vraiment raison à propos de la portabilité! Mais si je devais restreindre cet appel dans ma mise en œuvre sur la plate-forme qui prend en charge Linux, je pouvais très bien l'utiliser avec macro comme #Ifdef Linux (peut-être utiliser quelque chose comme utiliser des extensions C de Say GCC lorsque cela est possible). Comme vous l'avez mentionné, il est préférable de rester avec les normes. Merci pour vos idées!


a révoqué le -1 ... même la condition Yoda avec ... et pourquoi existe-t-il un c = getchar (); dans votre code?


@pmg Alors, quel est le moyen de plate-forme croix correct pour supprimer tous les caractères inutiles laissés après Scanf ou obtient?


@ROMENO: Le moyen de plate-forme croisé correct pour lire l'entrée de l'utilisateur est avec fgets () . Fgets () ne laisse pas de caractères inutiles dans le flux d'entrée.


@pmg Eh bien, ce n'est pas vrai. Msvc10 fgets () laisse des caractères inutiles dans le flux d'entrée. De plus, il ne renvoie pas NULL si vous avez entré plus que les caractères N-1 . Il ne fait que serrer le flux d'entrée vers n-1 . Suivant fgets continuera de consommer les caractères entrés.



2
votes

Un moyen de nettoyer n'importe quelle espace avant votre caractère souhaité et d'ignorer les caractères restants est

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


0 commentaires

2
votes

Vous pouvez utiliser la fonction Fflush pour effacer tout ce qui reste dans la mémoire tampon comme une consommation d'entrées de ligne COMANDE précédentes:

fflush(stdin);


1 commentaires

fflush (stdin) invoque un comportement non défini conformément à la norme C bien qu'il soit bien défini sur certains systèmes (implémentations), mais il est préférable de l'éviter afin d'améliorer la portabilité.