6
votes

C - Essayer de lire un seul char de STDIN (et échec) W / SCANF / GETCHAR

Dans le cadre d'une tâche des devoirs, j'essaie de lire un seul Char de STDIN et d'agir selon elle:

$ ./run
please enter [y]es, [n]o or [m]aybe: y<return>
you selected yes!
Please enter only 'y', 'n' or 'm'!
$ ./run
please enter [y]es, [n]o or [m]aybe: yes<return>
you selected yes!
Please enter only 'y', 'n' or 'm'!
Please enter only 'y', 'n' or 'm'!
Please enter only 'y', 'n' or 'm'!
$


0 commentaires

4 Réponses :


12
votes

Vous avez besoin d'un espace entre scanf (" et le % c pour fonctionner correctement: xxx

et vous avez également besoin de à utiliser et choisir, pas le choix!

Edit: pendant que vous y êtes, vous voudrez peut-être examiner faire tandis que () pour cette boucle (à moins que le professeur ait dit spécifiquement Utilisez un break ) - en fonction de fonctionne bien lors de la validation de l'entrée utilisateur!


2 commentaires

Jusqu'à ce que vous obteniez une entrée inattendue; Essayez d'entrer "y x z" par exemple.


Lol quelle légende!



4
votes

mieux encore, utilisez fgetc (). Scanf () devrait toujours être un dernier recours.


0 commentaires

5
votes

fflush () n'est pas défini par ISO C pour les flux d'entrée. Il est défini dans la bibliothèque d'exécution C Microsoft, mais n'est pas portable.

tandis que la solution "espace avant% C" peut fonctionner lorsque l'utilisateur entre dans les données attendues, elle échouera à bien des égards; Essayez d'entrer "y n y n" par exemple. L'entrée de la console est orientée ligne; Votre meilleur pari est de vous assurer de supprimer la ligne entière ainsi: xxx


0 commentaires

0
votes

Tout d'abord, je vais le garder bref.parce de points insuffisants pour soumettre un commentaire Si nous pouvons voir que le nombre de O / P est (un + le NON de la Charcter) Ceci est Beacuse lorsque nous appuyons sur Entrée après avoir saisi les personnages '\ n' qui est un caractère non imprimable également ajouté après votre chaîne.

$ ./run
please enter [y]es, [n]o or [m]aybe: y<return>
you selected yes!
Please enter only 'y', 'n' or 'm'!  -----------> it is due to reading of the '\n' by scanf


2 commentaires

C'est une solution de contournement pour le problème, n'est-ce pas? C'est donc un commentaire à la question (pas une réponse).


N'avez pas suffisamment de points que je voulais mais je ne savais pas que je serai donwnvote pour cela.