Pourquoi ne pas getchar() attends-moi d'appuyer sur entrée après le scanf()?
Je suis en train d'apprendre le C et je suis en utilisant "getchar()" pour arrêter la commande windows pour que je puisse voir les exercices fais mais ça ne marche pas. heres un exemple:
#include <stdio.h>
int main()
{
int value;
printf("1. option 1.\n2. option 2.\n3. option 3.\n4. Exit\n\nMake an option: ");
scanf("%d", &value);
switch (value)
{
case 1:
printf("you selected the option 1.");
break;
case 2:
printf("you selected the option 2.");
break;
case 3:
printf("you selected the option 3.");
break;
case 4:
printf("goodbye");
break;
default:
printf("thats not an option");
break;
}
getchar();
return 0;
}
c'est la sortie:
- l'option 1.
- l'option 2.
- option 3.
- Sortie.
Faire une option: 1
vous avez sélectionné l'option 1.
Processus a retourné 0 (0x0) execution time : 3.453 s
Appuyez sur n'importe quelle touche pour continuer.
Pourquoi ne pas attendre l'entrée du "getchar()"?
OriginalL'auteur | 2009-09-08
Vous devez vous connecter pour publier un commentaire.
Votre scanf seulement mangé le nombre, mais pas la fin de saut de ligne. Mettre un saut de ligne ou un espace blanc après le %d vous donnera alors le problème inverse, la lecture de trop loin.
C'est pourquoi les gens n'aiment pas les scanf.
Je suggère la lecture d'une ligne réelle (utiliser
fgets(3)
) et l'utilisation desscanf()
pour analyser la chaîne.OriginalL'auteur DigitalRoss
Tout d'abord, ne pas utiliser fflush() pour effacer un flux d'entrée; le comportement est indéfini:
Le problème est que la fuite de saut de ligne n'est pas consommée par le "%d" indicateurs de conversion, c'est donc être repris immédiatement par le
getchar()
. Il n'y a pas une meilleure façon de traiter avec cela, mais en général, l'approche est de lire l'ensemble de la ligne de texte (à l'aide defgets()
ouscanf()
avec une taille "%s" spécificateur de conversion), qui consomment le retour à la ligne, puis convertir le type de données cible à l'aide desscanf()
oustrtol()
oustrtod()
.OriginalL'auteur John Bode
Peut getchar être l'obtention de votre retour chariot que vous entrez après le 1?
Heck, si c'était mauvais. Je suis aimer le fflush réponse et de l'essayer.
Bien sûr ceux fflush gars étaient rright.
Mais c'est un comportement indéfini, potentiellement non-compatibles, et en particulier pas recommandé pour un devoirs de style d'apprentissage de l'expérience. Suivez le publié et normalisé d'API! 🙂
OriginalL'auteur John Lockwood
Le getchar() lit le \n à partir du clavier dans le scanf - voir ici pour plus d'info
OriginalL'auteur Preet Sangha
vous obtenez un retour chariot, la façon dont je voudrais obtenir autour d'elle, de définir un char et il suffit de scanner le retour chariot,
char ch;
(avant votre getch() entrez les informations suivantes)
scanf("%c",&ch);
getchar();
devraient travailler de cette façon, pas la façon la plus efficace de le faire, mais fonctionne pour moi.
OriginalL'auteur Naveed Choudhry
Je pense que vous avez entrée une entrée après avoir saisi "1". Il sera accepté par le
getchar()
.Si vous pouvez résoudre le problème simplement en ajouter un supplémentairegetchar()
après l'original, juste avant lareturn 0;
).** J'ai testé et ça a fonctionné.
OriginalL'auteur zxeoc
Comme déjà mentionné scanf feuilles \n derrière après la lecture de la saisie de l'utilisateur.
Soultion: ajouter getchar() tout de suite après le scanf.
Qui compense scanf carence.
c'est à dire
OriginalL'auteur Alex
lors de la lecture d'autres réponses ça vient de moi que vous pouvez utiliser
scanf("%d\n",&n);
au lieu de
scanf("%d",&n);
pour supprimer nouvelle ligne à partir de la mémoire tampon. Je n'ai pas vérifié cela.Espère que ça fonctionne 😀
Cela ne peut pas fonctionner comme prévu. En raison de la
\n
dans la chaîne de format,scanf
ne reviendra pas jusqu'à ce que vous entrez un caractère non-blanc après entrer les chiffres.OriginalL'auteur Jayanta Banik
getch
à la place? Pourriez-vous faire plus clair (si c'est effectivement le cas)?OriginalL'auteur don
pour que votre programme fonctionne, vous devez "vider" votre flux d'entrée avant d'appeler getchar() par un appel à fflush(stdin). Ce que ce n'est que lorsque vous tapez au clavier un nombre puis la touche retour, la mémoire tampon d'entrée reçoit les deux personnages, par exemple '1' et '\n', et votre appel à scanf obtient seulement '1' si le '\n' reste dans la mémoire tampon d'entrée. Lorsque vous appelez getchar, vous êtes "gettin" qui reste '\n'. Rinçage à l'entrée de tous les rejets de la mémoire tampon.
fflush(stdin)
est undefined behavior. Ne pas le faire.alors comment je dois faire? suis vraiment nouveau à cela, je viens de python comme mon premier langage de programmation, donc tout sur la gestion de la mémoire est du Chinois pour moi..
wow .. je ne savais pas .. juste fait quelques recherches et trouvé cette explication gidnetwork.com/b-57.html
Voir ma réponse ou de la accepté de répondre à stackoverflow.com/questions/1384073/.... Il revient à la une) à l'aide de
fgets
de lire l'ensemble de la ligne avant de l'analyser à l'aide desscanf
ou b) à mettre dans un deuxièmegetchar
"manger" le retour à la ligne.Désolée d'être dure environ
fflush(stdin)
, mais c'est une de ces choses qui semble vraiment comme il devrait fonctionner jusqu'à ce qu'il provoque un vilain bug que vous ne pouvez pas le suivre vers le bas.OriginalL'auteur nairdaen