[C] scanf et caractères [Fermé]

Signaler
-
Messages postés
4758
Date d'inscription
dimanche 12 juin 2011
Statut
Contributeur
Dernière intervention
2 juillet 2020
-
je débutte en C et j'ai un problème sur un programme
j'aimerai que l'utilisateur puisse saisir 2 caractères
le programme suivant ne marche pas je ne comprend pas pourquoi :o(


#include<stdio.h>

main()
{
      char caractere_1,caractere_2;
     
      printf("caractere_1 ? "); 
      scanf("%c",&caractere_1);
       
      printf("caractere_2 ? "); 
      scanf("%c",&caractere_2);
      
      printf("\n\n --> %c %c", caractere_1, caractere_2);
      getchar();getchar();

}


merci de votre aide

6 réponses

Messages postés
354
Date d'inscription
jeudi 2 juin 2005
Statut
Membre
Dernière intervention
30 décembre 2010
109
c'est parce que tu a unretour chariot dans le buffer...
(le char '\n')
peut etre qu'en faisant scanf("%c\n");
ca ira mieux, sinon fais un autre scanf ala suite pour 'purger' le buffer, mais c'est pas tres propre
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 63035 internautes nous ont dit merci ce mois-ci


mais c facil , lol
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 686
Non, pas scanf("%c\n");
Messages postés
7559
Date d'inscription
lundi 26 juin 2000
Statut
Contributeur
Dernière intervention
13 août 2018
437
Bonjour!

que t'affiche t il? y'a t il un message d'erreur?
il n'affiche aucun message d'erreur
je peux entrer le caractère1 normalement ( "caractère_1 ?" s'affiche à l'écran )
puis il affiche "caractère_2 ?"
jusque là tout va bien
mais ensuite le programme ne prend pas en compte le 2ème scanf et passe directement à la dernière instruction ( printf )
( " --> [ici le premier caractère entré]" s'affiche )

au final, j'ai à l'écran ( en prenant caractère1=a par exemple )

caractère_1 ? a
caractère_2 ?

 --> a 
ca marche avec le "fflush(stdin);" ...
merci beaucoup ^^
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 686
Bon, puisque quelqu'un a remonté le topic, et qu'aucune réponse n'est correcte, j'apporte ma contribution.

Tout d'abord, le seul prototype de main() sans argument valable est : int main (void).

Le main() renvoie un int ; donc il faut mettre : return 0; en fin de main() pour dire que tout s'est bien déroulé.

Sinon concernant le problème, il faut purger le buffer clavier entre les 2 scanf(). fflush(stdin) comme préconisé est faux. Le fflush() a un comportement indéterminé sur stdin. Donc fflush(stdin) est à proscrire.

Il suffit de se faire une fonction :
void videBuffer(void) {
     int c;
     while ( (c=getchar()) != '\n' && c != EOF );
}

Et d'appeler videBuffer() après chaque scanf("%c",...);

Cdlt,
Messages postés
7559
Date d'inscription
lundi 26 juin 2000
Statut
Contributeur
Dernière intervention
13 août 2018
437
ou, après ton premier scanf, tu mets
fflush (stdin); qui vide le buffer d'entrée...
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 686
Non, fflush(stdin) a un comportement indéterminé.
Messages postés
4758
Date d'inscription
dimanche 12 juin 2011
Statut
Contributeur
Dernière intervention
2 juillet 2020
1 031
Comme dit fiddy,
fflush(stdin)
c'est mauvais: pas défini par le standard, mais populaire à cause de l'implémentation de Windows, qui n'est évidemment pas cross-platform.
C'est pas bien de prendre des habitudes quand on bosse avec un système de m*rde hein...