comprend pô!

comprend pô! - C++ - Programmation

Marsh Posté le 17-03-2003 à 13:04:57    

pff :pfff:  
quelqu'un pourrai il m'expliquer comment est il possible que ceci reagisse comme cela!?

Code :
  1. #include <stdlib.h>
  2. int main(){
  3. char c;
  4. char *IP, *res_id;
  5. int Port=14535;
  6. unsigned i;
  7. do{
  8.  printf("\n\t1) Envoyer Fichier\n\t2) Recevoir Fichier\n\t3) Changer Port <%d>\n\t\9) Quitter\n", Port);
  9.  c=getchar();
  10.  if(c == '1'){
  11.   printf("\tConfiguration : \n\t\tIP destination : " );
  12.   IP=malloc(200);
  13.   scanf("%s", IP);
  14.   i=0;
  15.   do{
  16.    printf("\t fichier : " );
  17.    res_id=malloc(500);
  18.    scanf("%s", res_id);
  19.    printf("\n" );
  20.    printf("\n8) retourner au Menu Principal\n" );
  21.    c=getchar();
  22.   }
  23.   while(c != '8' && c != '9' );
  24.  }
  25.  if(c == '2'){
  26.   do{
  27.     printf("\n8) retourner au Menu Principal\n" );
  28.     scanf("%c", &c);
  29.   }
  30.   while(c != '8' && c != '9' );
  31.  }
  32.  if(c== '3'){
  33.   printf("\tConfiguration : \n\t\tPort : " );
  34.   scanf("%d", &Port);
  35.        }
  36. }
  37. while(c!='9');
  38. return EXIT_SUCCESS;
  39. }


Si j'entre 2 au clavier deja y me propose 2fois : "n8) retourner au Menu Principal" alors que d'après moi il n'y a vraiment aucun raison; y me laisse entré mon choise qu' a la deuxième passe???
si j'entre 8 y me reaffiche deux fois le menu de base. Idem : comprend vraiment pas pk!!!??
 

Reply

Marsh Posté le 17-03-2003 à 13:04:57   

Reply

Marsh Posté le 17-03-2003 à 13:22:45    

Salut !
 
Commences déjà par allouer ta mémoire correctement, c'est à dire une seule fois, par un

Code :
  1. IP=malloc(200);
  2. res_id=malloc(500);


avant de rentrer dans la boucle. Bien sûr, il faut désallouer à la fin avec des "free".
 
Ensuite avec l'utilisation des flux il faut faire gaffe que le flux soit bien vide avant de tenter quoique ce soit... essayes d'utiliser "fflush(stdin)".
 
Enfin, je n'ai pas l'impression que ton algo de gestion des choix du clavier soit pertinent. Ca m'a l'air un peu compliqué, tous ces do/while. Tu veux faire quoi, exactement ?

Reply

Marsh Posté le 17-03-2003 à 13:28:19    

le fflush(stdin) n'a aucun effet
 
 
ton rpoblèem, c'est que getchar() lit ds caractères au calvier, y compris '\n' qui est la touche entrée. alros soit tu ignore ce cas, soit tu résout ça en remplacant par un scanf("%c", &c)
 
quand a ta boucle, le cas générique, c'est de l'arretez quand quand getcahr() renvoie EOF
 
sinon, bien pour le EXIT_SUCCESS, bien que ça ne soit pas si victorieux que ça puisque tu ne free pas tes pointeurs
 
il manque un petit #include <stdio.h>

Reply

Marsh Posté le 17-03-2003 à 18:46:22    

bien vu!! ;)
 
j'ai utilisé fflush(stdin); et ça marche! :)
 
(j'ai compris le truc du \n et ça m'a l'aire d'être la cause mais aparement scanf("%c", &c) pose le même prob par contre si j'utilise scanf("%s", c); que j'initialise char *c=malloc(2); que je remplace tout les c par c[0] : ça marche (ce ki est asez logique après coup puisque mon string sera constitué d'un char et de \n)
 
Merci!

Reply

Marsh Posté le 17-03-2003 à 19:07:42    

Peak a écrit :

bien vu!! ;)
j'ai utilisé fflush(stdin); et ça marche! :)

n'importe quoi.... fais une petit recherche sur le forum je t'en supplie

Reply

Marsh Posté le 17-03-2003 à 19:10:33    

++Taz a écrit :

n'importe quoi.... fais une petit recherche sur le forum je t'en supplie


 
J'ai un peu la flemme de faire la recherche, mais quand le teminal est en mode ligne, ça te flush pas le début de la ligne ?
 
En mode caractère, c'est sûr que ça doit pas trop changer.

Reply

Marsh Posté le 17-03-2003 à 19:27:29    

le comportement de fflush sur des flux entrants est absolument indéfini et ne fais absolument rien sur la plupart des systemes: et si ca fonctionne sur votre systeme, soyez sure que ça ne fonctionnera pas ailleurs. c'est le plus gros mythe qui existe en C. pour vider un flux, il faut lire à coup de fgetc .|

Reply

Marsh Posté le 17-03-2003 à 19:35:08    

++Taz a écrit :

le comportement de fflush sur des flux entrants est absolument indéfini et ne fais absolument rien sur la plupart des systemes: et si ca fonctionne sur votre systeme, soyez sure que ça ne fonctionnera pas ailleurs. c'est le plus gros mythe qui existe en C. pour vider un flux, il faut lire à coup de fgetc .|


 
Merci.
 
Excellent, et nommer la fonction outfflush ou un truc un peu documentaire du genre ça leur serait pas venu à l'idée ?¿?


Message édité par nraynaud le 17-03-2003 à 19:37:31
Reply

Marsh Posté le 17-03-2003 à 19:40:15    

non. le fait est que fflush,ça n'a pas de sens sur un flux d'entrée. quand on dit fluser unf lux, on veut dire, finaliser les operations d'ecriturs bufferisés pour assurer la cohérence avec son disuqe dur par exemple. donc onv eut pas dire: coup de baguette magique, fais disparaitre le contenu du buffer. pourtant c'est ce qu'attende les gens quand ils font ça

Reply

Marsh Posté le 18-03-2003 à 09:15:02    

Au temps pour moi, j'avais toujours cru sur parole les gens qui me disaient "met un fflush et ça videra le buffer". Je vérifierais mes sources la prochaine fois.  :jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed