[C] scanf et caractères

3. -  
ElementW Messages postés 5690 Statut Contributeur -
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

  1. Timon1102 Messages postés 354 Statut Membre 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
    1. madeinchina
       
      mais c facil , lol
      0
    2. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      Non, pas scanf("%c\n");
      0
  2. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    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,
    1
  3. maily Messages postés 7560 Statut Contributeur 453
     
    Bonjour!

    que t'affiche t il? y'a t il un message d'erreur?
    0
  4. 3.
     
    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 
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. 3.
     
    ca marche avec le "fflush(stdin);" ...
    merci beaucoup ^^
    0
  7. maily Messages postés 7560 Statut Contributeur 453
     
    ou, après ton premier scanf, tu mets
    fflush (stdin); qui vide le buffer d'entrée...
    -1
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      Non, fflush(stdin) a un comportement indéterminé.
      0
    2. ElementW Messages postés 5690 Statut Contributeur 1 293
       
      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...
      0