Getchar();
Fermé
UNIX/VI/SHELL
Messages postés
87
Date d'inscription
mercredi 12 juillet 2006
Statut
Membre
Dernière intervention
8 avril 2009
-
23 déc. 2008 à 19:52
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 3 janv. 2009 à 14:42
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 3 janv. 2009 à 14:42
12 réponses
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
23 déc. 2008 à 20:12
23 déc. 2008 à 20:12
Salut,
Non ça ne bug pas, c'est le comportement classique du C avec son buffer clavier.
getchar() est fait pour stocker un seul caractère, le reste ( y compris le '\n') sera stocké dans le buffer clavier.
Il faut donc le vider.
Et pour le vider, un simple : while(getchar()!='\n'); suffira.
Cdlt
Non ça ne bug pas, c'est le comportement classique du C avec son buffer clavier.
getchar() est fait pour stocker un seul caractère, le reste ( y compris le '\n') sera stocké dans le buffer clavier.
Il faut donc le vider.
Et pour le vider, un simple : while(getchar()!='\n'); suffira.
Cdlt
UNIX/VI/SHELL
Messages postés
87
Date d'inscription
mercredi 12 juillet 2006
Statut
Membre
Dernière intervention
8 avril 2009
7
30 déc. 2008 à 18:22
30 déc. 2008 à 18:22
En fait, le problème vient du fait que si l'utilisateur ne tape rien (Juste entrer), il se place en dessous de la ligne et la aucune commande ne marche, et si l'utilisateur en tape une, cela ne l'exécutera pas.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
30 déc. 2008 à 18:46
30 déc. 2008 à 18:46
Ah, d'accord. Oui c'est normal. Puisque dans ce cas, il n'y a pas de '\n' dans le buffer.
Utilise plutôt :
Cdlt
Utilise plutôt :
char c; c=getchar(); if(c!='\n') while(getchar()!='\n');
Cdlt
Salut,
J'apprends le C en ce moment, et j'ai eu le même genre de surprise.
Mais, effectivement c'est normal. Et il faut bien vider le buffer.
Pour bien comprendre, si dans le buffer il y a un \n, lorsque le programme arrive à la ligne suivante:
printf("Tapez votre réponse: ");
printf("%c", getchar());
le curseur va à la ligne sur l'écran! Alors qu'il n'y a pas de \n au bout du premier printf.
Si on fait, avant, un: while (getchar() != '\n');
le curseur reste bien en bout de ligne.
J'apprends le C en ce moment, et j'ai eu le même genre de surprise.
Mais, effectivement c'est normal. Et il faut bien vider le buffer.
Pour bien comprendre, si dans le buffer il y a un \n, lorsque le programme arrive à la ligne suivante:
printf("Tapez votre réponse: ");
printf("%c", getchar());
le curseur va à la ligne sur l'écran! Alors qu'il n'y a pas de \n au bout du premier printf.
Si on fait, avant, un: while (getchar() != '\n');
le curseur reste bien en bout de ligne.
UNIX/VI/SHELL
Messages postés
87
Date d'inscription
mercredi 12 juillet 2006
Statut
Membre
Dernière intervention
8 avril 2009
7
28 déc. 2008 à 10:47
28 déc. 2008 à 10:47
Bah en fait y a un autre problème; Maintenant l'utilisateur peut taper deux instructions, alors qu'en théorie il ne peut qu'en taper une seule.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
28 déc. 2008 à 11:44
28 déc. 2008 à 11:44
Salut,
Affiche ton code.
Affiche ton code.
UNIX/VI/SHELL
Messages postés
87
Date d'inscription
mercredi 12 juillet 2006
Statut
Membre
Dernière intervention
8 avril 2009
7
28 déc. 2008 à 12:33
28 déc. 2008 à 12:33
Le code en entier est bien trop gros, je donne ici un exemple de la situation
#include <stdio.h>
int main ()
{
printf ("Tape A ou B \n");
char c = getchar();
while (getchar()!='\n');
switch (c) {
case 'A' :
case 'B' :
printf ("GG ^^ XD LOL \n");
break;
default :
break;
}
return 0;
}
#include <stdio.h>
int main ()
{
printf ("Tape A ou B \n");
char c = getchar();
while (getchar()!='\n');
switch (c) {
case 'A' :
case 'B' :
printf ("GG ^^ XD LOL \n");
break;
default :
break;
}
return 0;
}
UNIX/VI/SHELL
Messages postés
87
Date d'inscription
mercredi 12 juillet 2006
Statut
Membre
Dernière intervention
8 avril 2009
7
28 déc. 2008 à 21:29
28 déc. 2008 à 21:29
Je sais que le contenu de printf est un peu fou... Mais y a vraiment pas une seule personne au courant ?
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
29 déc. 2008 à 17:41
29 déc. 2008 à 17:41
Comment ça, il peut taper deux instructions ?? Donne un exemple.
Maker06
Messages postés
337
Date d'inscription
lundi 22 décembre 2008
Statut
Membre
Dernière intervention
27 décembre 2009
63
29 déc. 2008 à 17:51
29 déc. 2008 à 17:51
Salut, dans ton code il te manque un "break" dans le cas 'A' de ton switch.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
29 déc. 2008 à 18:06
29 déc. 2008 à 18:06
Pas forcément. S'il souhaite afficher son printf quand l'utilisateur tape A ou B ;)
UNIX/VI/SHELL
Messages postés
87
Date d'inscription
mercredi 12 juillet 2006
Statut
Membre
Dernière intervention
8 avril 2009
7
30 déc. 2008 à 10:54
30 déc. 2008 à 10:54
C'est fiddy qui a raison. Là je ne donne qu'un exemple de la situation. Le problème étant que si vous compilé le programme, vous remarquez que celui ci accepte deux instructions. Dans la logique vous ne devez taper qua A ou B ou Rien. Mais là vous pouvez taper A et B ensemble, le programme répond. Alors que théoriquement s'il y a plus d'une inscrution celui-ci doit arreter ou renvcoyer un message d'erreur.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
30 déc. 2008 à 16:01
30 déc. 2008 à 16:01
Salut,
Tu ne peux pas facilement juste obliger l'utilisateur à ne taper qu'un caractère. Si tu veux quand même le faire, utilise getch() de conio.h sous windows. Mais ça ne sera pas portable, sous linux il faudra passer le terminal en raw.
Le mieux (portable, et facilité), est d'utiliser getchar(), l'utilisateur pourra taper autant de caractères qu'il souhaite, mais toi tu ne récupères que le premier (les autres seront ignorés). Tu peux faire un : putchar(c), pour voir qu'il ne prend qu'un caractère ;)
Tu ne peux pas facilement juste obliger l'utilisateur à ne taper qu'un caractère. Si tu veux quand même le faire, utilise getch() de conio.h sous windows. Mais ça ne sera pas portable, sous linux il faudra passer le terminal en raw.
Le mieux (portable, et facilité), est d'utiliser getchar(), l'utilisateur pourra taper autant de caractères qu'il souhaite, mais toi tu ne récupères que le premier (les autres seront ignorés). Tu peux faire un : putchar(c), pour voir qu'il ne prend qu'un caractère ;)
cchristian
Messages postés
921
Date d'inscription
lundi 21 janvier 2008
Statut
Membre
Dernière intervention
6 mars 2012
131
30 déc. 2008 à 21:44
30 déc. 2008 à 21:44
Bonsoir,
Comme je n'ai, à ce jour obtenu aucune réponse à la discussion ci-dessous portant sur le même sujet :
http://www.commentcamarche.net/forum/affich 9938747 getch sous linux?#5
je renouvelle ma proposition de test sous unix que j'avais soumise à cette occasion:
Comme je n'ai, à ce jour obtenu aucune réponse à la discussion ci-dessous portant sur le même sujet :
http://www.commentcamarche.net/forum/affich 9938747 getch sous linux?#5
je renouvelle ma proposition de test sous unix que j'avais soumise à cette occasion:
Essaie en mettant : #include <wchar.h> après avoir défini touche : wint_t touche = 0; et en utilisant l'ordre : touche = _getwch (); c'est apparemment portable ............https://fr.wikipedia.org/wiki/Biblioth%C3%A8que_standard_de_C
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
31 déc. 2008 à 14:08
31 déc. 2008 à 14:08
Non, ce n'est pas portable _getwch. Par contre tu peux utiliser getwchar();
Mais son problème restera le même étant donné que cette fonction sert juste à avoir des caractères larges.
Mais son problème restera le même étant donné que cette fonction sert juste à avoir des caractères larges.
cchristian
Messages postés
921
Date d'inscription
lundi 21 janvier 2008
Statut
Membre
Dernière intervention
6 mars 2012
131
>
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
31 déc. 2008 à 17:28
31 déc. 2008 à 17:28
Bonjour,
Merci pour ta réponse,
Le problème avec getwchar () est la perte de "l'intéractivité" clavier/progamme ramenée au caractère frappée ou à la touche pressée.
En conservant cette particularité, il est possible d'élaborer une logique d'exécution plus souple et plus sensible.
Es-tu certain que _getwch n'est pas portable ? Cette instruction dépend de wchar.h et pas de conio.h.
Merci pour ta réponse,
Le problème avec getwchar () est la perte de "l'intéractivité" clavier/progamme ramenée au caractère frappée ou à la touche pressée.
En conservant cette particularité, il est possible d'élaborer une logique d'exécution plus souple et plus sensible.
Es-tu certain que _getwch n'est pas portable ? Cette instruction dépend de wchar.h et pas de conio.h.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
>
cchristian
Messages postés
921
Date d'inscription
lundi 21 janvier 2008
Statut
Membre
Dernière intervention
6 mars 2012
3 janv. 2009 à 14:42
3 janv. 2009 à 14:42
Sur ma machine, je n'ai pas la fonction _getwch, voilà ce qui me fait dire que ce n'est pas portable. Et je ne vois pas de man sur cette fonction. En fait, il n'existe pas de fonctions portables créant ce comportement (sans echo comme getch (conio.h). En C, c'est au programmeur de jouer sur la console cooked ou raw pour définir le mode sans echo.
Cdlt
Cdlt