[C] scanf récalcitrant

Résolu
strato-boy Messages postés 769 Date d'inscription   Statut Membre Dernière intervention   -  
strato-boy Messages postés 769 Date d'inscription   Statut Membre Dernière intervention   -
salut la compagnie !!

j'ai codé une petite fonction (qui n'as pour but que de tester une autre fonction ... ) Mais j'ai dans cette fonction un scanf qui n'est pas appelé, et pas moyen de savoir pourquoi ... voici le code :

void testCaesar(void)
{
	char clef = 0;
	char *text = malloc(100*sizeof(text));
	printf("\nEntrez la lettre clé\n");
	scanf("%c", &clef);                                         // la ligne récalcitrante
	printf("Entrez la phrase a crypté\n");
	scanf("%s", text);
	printf("%s\n",caesar(text, clef));
}


voila, ça compile ( avec la commande gcc -Wall -Werror ) mais le premier scanf est ignoré .
merci a vous qui pourrez m'aider ;-)



A voir également:

4 réponses

fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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,
1
strato-boy Messages postés 769 Date d'inscription   Statut Membre Dernière intervention   101
 
merci de toute ces précision, et de ta proposition, mais je préfère chercher, trouver et comprendre plutôt que d'avoir une fonction toute faite en risquant de ne pas la comprendre ;-)

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 !
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
A strato-boy,
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
0
strato-boy Messages postés 769 Date d'inscription   Statut Membre Dernière intervention   101
 
while, getchar(), if ... je pense que je pourrais m'en sortir pour la coder (d'autant plus que je vois a peu près comment ça va marché) ;-)

en tout cas merci pour tout !
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
j'ai toujours du mal avec scanf (récalcitrant pour moi aussi :-p )
Dans ton cas, il vaut mieux utiliser getch().
0
strato-boy Messages postés 769 Date d'inscription   Statut Membre Dernière intervention   101
 
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)

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 :-)
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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.
0
slikke Messages postés 50 Date d'inscription   Statut Membre Dernière intervention   13
 
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)
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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.
0
slikke Messages postés 50 Date d'inscription   Statut Membre Dernière intervention   13
 
ah oui effectivement désolé pour mon erreur :s
Du coup je ne vois pas d'où peux venir l'erreur...
0
ydurce Messages postés 78 Date d'inscription   Statut Membre Dernière intervention   18
 
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
0