Ajouter un commentaire

fredericmazue

Bonjour,

Je réponds aux trois posts d'un coup si vous me le permettez.

Quote:

Bonjour à tous, cela fait un bout de temps que je cherche une solution sur le forum dans des sujets déjà traités, mais je n'ai rien trouvé.

LoL :lol: :lol:
C'est à croire que plus personne ne connaît le C ;)
Bon tu vas trouver ici alors :)

Quote:

Pourriez-vous me dire où se trouve mon erreur ? Pour "fflush(stdout);", je l'ai trouvé sur le forum, ça a corrigé un peu le problème mais pas entièrement.

Quel problème ? Ton code n'est pas faux du point de vue du langage. Si tu dis qu'il y a problème c'est qu'il ne se comporte pas comme tu l'entends, et dans ce cas, c'est une bonne idée de préciser le problème dans la question.
Il n'y a aucune raison que fflush(stdout) règle quoi que ce soit.

Quote:

Ta façon de récupérer les entrées est bizarre, surtout pour l'entier.

Non c'est correct. Ca ne marche pas mais c'est correct ;)

Ah les mystères des entrées/sorties du C...

Bon tout d'abord:
La chaîne de formatage "%c*c" n'a pas de sens.
Le signe * dans une chaîne de formatage est un inhibiteur d'affectation. Concrètement dans le cas présent "%c*c" veut dire: on affecte dans lettre1 puis on affecte pas dans lettre1, ce qui n'a pas de sens, donc.

Voilà où est le problème. Quant tu fais scanf("%c*c",&lettre1); tu lis 1 (j'insiste, un seul) caractère depuis la console. MAIS tu en saisis DEUX. Le caractère lui même et le retour chariot (return) qui reste dans le tampon.
Quand tu repasses sur scanf("%c*c",&lettre1); tu lis toujours 1 caractère mais lequel ? Tu en saisis toujours deux, à savoir une lettre et un retour chariot. Donc dans le tampon d'entrées, il y a maintenant TROIS caractères deux retour chariot et une lettre, à la queue leu leu comme ceci

retour-chariot -- lettre -- retour-chariot

que lit REELLEMENT le scanf alors ? tout simplement le premier retour chariot. et ainsi de suite.

Le code proposé par jrebillat fonctionne car il lit une chaîne totale avec le scanf ce qui a pour effet de dégager le retour chariot final (ainsi en est il des entrées/sorties du C et de leurs contradictions) qui est donc sorti du tampon d'entrée. Puis il convertit la chaîne lue en la valeur voulue avec sscanf (mystix, je te renvoie à la doc de ton compilo ou une doc en ligne sur le C, ca sera expliqué). Toutefois dans le code de jrebillat, la chaîne de formatage "%c*c" n'a pas plus de sens et les fflush sont tout autant inutiles.

Voici le code que tu voulais écrire. le principe consiste à faire tomber le retour chariot de saisie dans une trappe (char dummy)

#include <stdio.h> 


int main (void) 

{  int a,chiffre; 
   char lettre1;
   char dummy;
      
   a=1; 
      
   while (a<5) 
   {  
     printf("ligne\n"); 
     scanf("%c%c",&lettre1, &dummy); 
     printf("%c\n",lettre1); 
     printf("colonne\n"); 
     scanf("%d",&chiffre);
	 scanf("%c",&dummy);
     printf("%d\n\n",chiffre); 
     a++; 
  } 
}

Maintenant ATTENTION.
Le code est correct du point de vue du C et du point de vue du comportement souhaité.
Ca n'en reste pas moins une hérésie de programmation car si l'utilisateur saisit 2 caractères au lieu d'un seul demandé il y a débordement de tampon et comportement abberrant. Donc je crains que toute la copie ne soit à revoir en fait. Mais dans un premier temps pour essayer le reste de ton programme, tu peux partir là-dessus.
Le code proposé par jrebillat est plus sécurisé, mais présente le même problème si un facétieux saisit 10 caractères. Avec le zéro de fin de chaîne ;) ca en fait 11 et on a un bon vieux débordement de tampon des familles dans buf.

Filtered HTML

Plain text

CAPTCHA
Cette question permet de vérifier que vous n'êtes pas un robot spammeur :-)
 N   N   AA   K  K   CCC  BBBB  
NN N A A K K C B B
N N N AAAA KK C BBBB
N NN A A K K C B B
N N A A K K CCC BBBB