[C] scanf récalcitrant
Résolu/Fermé
strato-boy
Messages postés
769
Date d'inscription
mercredi 11 février 2009
Statut
Membre
Dernière intervention
19 janvier 2011
-
26 oct. 2010 à 11:37
strato-boy Messages postés 769 Date d'inscription mercredi 11 février 2009 Statut Membre Dernière intervention 19 janvier 2011 - 27 oct. 2010 à 09:32
strato-boy Messages postés 769 Date d'inscription mercredi 11 février 2009 Statut Membre Dernière intervention 19 janvier 2011 - 27 oct. 2010 à 09:32
A voir également:
- [C] scanf récalcitrant
- Supprimer fichier récalcitrant - Guide
- Scanf windows - Guide
- Logiciel pour désinstaller un logiciel récalcitrant - Télécharger - Nettoyage
- Scanf segmentation fault ✓ - Forum Programmation
- Scanf java ✓ - Forum C
4 réponses
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
26 oct. 2010 à 21:06
26 oct. 2010 à 21:06
Bonjour,
Il ne faut jamais oublier le buffer clavier en C.
Lorsque tu utilises scanf("%c",&cle); il y aura un '\n' (touche entrée) dans le buffer dû à la validation du caractère. Au passage, vaut mieux utiliser getchar qui sera plus performant. Par exemple : int cle=getchar();
Après le scanf("%c",...) ou le getchar(), il faut vider le buffer clavier.
Un simple getchar(); juste après ton scanf marchera. Mais il ne faut pas que l'utilisateur soit blagueur et tape deux caractères. Si tu veux, je peux te coder une fonction pour vider le buffer clavier après ton scanf("%c", ...).
Sinon, un exemple avec getchar();
int cle;
cle=getchar(); /*pour remplacer ton scanf("%c",&cle);*/
getchar(); /*marche uniquement si l'utilisateur tape un seul caractere*/
scanf("%s", text); /*marche si l'utilisateur ne tape pas un mot trop grand*/
getchar(); /*idem*/
De plus attention à l'allocation de ta chaîne text : char *text=malloc(100); suffit car un char vaut toujours 1 byte. Ou sinon char *text=malloc(100*sizeof *text); ou encore char *text=malloc(100*sizeof(char));
Cdlt,
Il ne faut jamais oublier le buffer clavier en C.
Lorsque tu utilises scanf("%c",&cle); il y aura un '\n' (touche entrée) dans le buffer dû à la validation du caractère. Au passage, vaut mieux utiliser getchar qui sera plus performant. Par exemple : int cle=getchar();
Après le scanf("%c",...) ou le getchar(), il faut vider le buffer clavier.
Un simple getchar(); juste après ton scanf marchera. Mais il ne faut pas que l'utilisateur soit blagueur et tape deux caractères. Si tu veux, je peux te coder une fonction pour vider le buffer clavier après ton scanf("%c", ...).
Sinon, un exemple avec getchar();
int cle;
cle=getchar(); /*pour remplacer ton scanf("%c",&cle);*/
getchar(); /*marche uniquement si l'utilisateur tape un seul caractere*/
scanf("%s", text); /*marche si l'utilisateur ne tape pas un mot trop grand*/
getchar(); /*idem*/
De plus attention à l'allocation de ta chaîne text : char *text=malloc(100); suffit car un char vaut toujours 1 byte. Ou sinon char *text=malloc(100*sizeof *text); ou encore char *text=malloc(100*sizeof(char));
Cdlt,
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
26 oct. 2010 à 12:42
26 oct. 2010 à 12:42
j'ai toujours du mal avec scanf (récalcitrant pour moi aussi :-p )
Dans ton cas, il vaut mieux utiliser getch().
Dans ton cas, il vaut mieux utiliser getch().
strato-boy
Messages postés
769
Date d'inscription
mercredi 11 février 2009
Statut
Membre
Dernière intervention
19 janvier 2011
100
26 oct. 2010 à 14:06
26 oct. 2010 à 14:06
la fonction getchar() me pose le même probleme que le scanf,
la fonction getch() ne compile pas ... (et comme l'indique le man, oui j'ai inclue curses.h)
en tout cas, merci ne ton intérêt :-)
la fonction getch() ne compile pas ... (et comme l'indique le man, oui j'ai inclue curses.h)
gcc -Wall -o "main" "main.c" main.c:(.text+0x1f5): undefined reference to 'stdscr' main.c:(.text+0x1fd): undefined reference to 'wgetch' collect2: ld returned 1 exit status Compilation échouée.
en tout cas, merci ne ton intérêt :-)
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
26 oct. 2010 à 14:13
26 oct. 2010 à 14:13
http://pwet.fr/man/linux/fonctions_bibliotheques/gets/
c'est à getchar que je pensais. curses.h, c'est bien, mais il doit falloir lier avec une bibliothèque.
Il faut peut être vider le buffer de lecture... Je ne sais plus comment il faut faire, mais c'est une opération courante, en cherchant tu doit trouver facilement.
c'est à getchar que je pensais. curses.h, c'est bien, mais il doit falloir lier avec une bibliothèque.
Il faut peut être vider le buffer de lecture... Je ne sais plus comment il faut faire, mais c'est une opération courante, en cherchant tu doit trouver facilement.
slikke
Messages postés
50
Date d'inscription
lundi 24 mai 2010
Statut
Membre
Dernière intervention
26 octobre 2010
13
26 oct. 2010 à 14:24
26 oct. 2010 à 14:24
Bonjour,
Le probleme vient de la ligne
char clef = 0;
Elle force le type de clef en int il faut donc mettre
char clef = '';
de cette maniere clef est un char initialisé (il est vide)
Le probleme vient de la ligne
char clef = 0;
Elle force le type de clef en int il faut donc mettre
char clef = '';
de cette maniere clef est un char initialisé (il est vide)
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
26 oct. 2010 à 14:34
26 oct. 2010 à 14:34
n'importe quoi !
tu confonds char et char*. char est un type d'entier de toute manière. Je ne vois pas comment il pourrait être vide.
tu confonds char et char*. char est un type d'entier de toute manière. Je ne vois pas comment il pourrait être vide.
slikke
Messages postés
50
Date d'inscription
lundi 24 mai 2010
Statut
Membre
Dernière intervention
26 octobre 2010
13
26 oct. 2010 à 14:56
26 oct. 2010 à 14:56
ah oui effectivement désolé pour mon erreur :s
Du coup je ne vois pas d'où peux venir l'erreur...
Du coup je ne vois pas d'où peux venir l'erreur...
ydurce
Messages postés
78
Date d'inscription
samedi 9 octobre 2010
Statut
Membre
Dernière intervention
12 décembre 2010
18
26 oct. 2010 à 20:07
26 oct. 2010 à 20:07
probablement le flux d'entrée qui n'est pas vide quand tu entres dans ta fonction (voir en amont ou faire un getchar avant ?)
petite remarque: ton malloc alloue 100*(char *) . Je pense que tu voulais allouer 100 * char.
cdlt
petite remarque: ton malloc alloue 100*(char *) . Je pense que tu voulais allouer 100 * char.
cdlt
26 oct. 2010 à 22:50
en tout cas c'est exact, en plaçant un simple getchar(); devant le cle = getchar(); ça passe, donc je vais corriger un peu le code pour y remédier.
pour l'allocation mémoire oui, un *text= malloc(100*sizeof(char)); correspond mieux au resultat que je voulais !
enfin bref encore une fois, je me fais avoir sur des petit detail ! merci pour tout !
27 oct. 2010 à 08:33
T'inquiète pas le code pour vider le buffer est très simple, il se résume à une boucle while et un getchar() avec un if dans ton cas. Rien de plus, rien de moins ;-))).
Bonne continuation
27 oct. 2010 à 09:32
en tout cas merci pour tout !