Bonjour,

j'ai posté il y a un petit moment pour un problème de saisie au clavier.

Le problème était qu'il y avait à la fois des scanf et des fgets dans mon programme.

Suivant les conseils j'ai donc obtenu les deux fonctions :
- saisieChaine
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
void saisieChaine(char *chaine, size_t size, FILE *file){
   int saisie_OK = 0;
   while (saisie_OK == 0){
      fgets (chaine, size, file);
      saisie_OK = !fclean (chaine, file);
      if (saisie_OK==0){
        fprintf (stderr, "Saisie trop longue, recommencez\n");
      }
   }
}
et
- fclean
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int fclean(char *chaine, FILE *file){
  int erreur = 0;
  if (chaine != NULL && file != NULL){
    char *sautLigne = strchr(chaine, '\n');
    //si la saisie n'a pas ete tronquee 
    if (sautLigne != NULL){  
      //on remplace '\n' par '\0' 
      *sautLigne = '\0';  
    }
    //si la saisie a ete tronquee, on purge le flux d'entree
    else{  
      int c;
      while ((c = fgetc (file)) != '\n' && c != EOF);
      erreur = 1;
    }
  }
  return erreur;
}
Cela marche très bien mon problème est plutôt de comprendre pourquoi ça ne marchait pas ^^.

Donc mes questions sont :
1) quel est le problème quand on utilise scanf et fgets dans un même programme (un problème de buffer si j'ai bien compris mais j'aimerais bien avoir des details).
2) a quoi sert a ligne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
      while ((c = fgetc (file)) != '\n' && c != EOF);
A purger le flux d'entrée daccord mais quel est le problème si on ne la met pas ?


Merci d'avance pour vos réponses