Bonjour,
J'ai quelques difficultés à bien maîtriser les différentes approches pour faire une saisie au clavier en langage C.
Je suis en 1ère année de DUT info et j'ai différents sons de cloches entre les FAQ, les tutoriels et les cours de mes professeurs
La FAQ C m'a bien aidé, mais j'ai encore besoin de quelques éclaircissements :
1) Le buffer
Quand on effectue une saisie avec scanf / gets / getchar, le caractère '\n' reste dans le buffer.
Mes profs m'ont dit d'utiliser fflush(stdin) pour le vider, mais lorsque je teste chez moi je me rends compte que ça marche absolument pas (j'utilise GNU/Linux et GCC).
Est-ce que ça marche sur certaines plate-formes et pas sur d'autres ? Quel est l'utilité de fflush(stdin) alors ?
Je codais déjà un peu en C avant de rentrer en IUT, et j'ai l'habitude d'utiliser pour vider le buffer :
(En fait, je n'avais encore j'avais vu fflush() auparavant)
Code : Sélectionner tout - Visualiser dans une fenêtre à part while (getchar() != '\n');
Mais la FAQ préconise :
Qu'est-ce que ce code fait de mieux ? Comment un caractère EOF peut se retrouver dans le buffer puisqu'on valide les saisies avec la touche enter, qui correspond à '\n' ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 int c; while ((c = getchar()) != '\n' && c != EOF); /* mange le tampon */
2) La saisie d'un caratère :
Est-ce qu'il y a une différence entre :
et :
Code : Sélectionner tout - Visualiser dans une fenêtre à part c = getchar();
Code : Sélectionner tout - Visualiser dans une fenêtre à part scanf("%c", &c);
3) Passons aux chaînes de caractères :
Mes profs m'ont dit d'utiliser uniquement gets(texte); , tout en condamnant l'usage de scanf("%s", texte); .
Je sais bien qu'aucune de ces fonctions n'est faite pour interagir avec l'utilisateur, et qu'il faut utiliser fgets(), mais je me pose les question suivantes :
- Quelle est la différence entre gets(texte); et scanf("%s", texte); ?
J'ai remarqué qu'on peut faire un scanf("%d", &entier); entre deux scanf("%s", texte); , alors qu'on ne peut pas le faire entre deux gets(texte); .
Pourquoi ? Un '\n' ne devrait-il pas rester dans le buffer et être mangé par le deuxième scanf("%s", texte); avant que la saisie n'ait lieu ?
- Pourquoi gets me donne droit un avertissement à la compilation (the `gets' function is dangerous and should not be used.) ? Mes profs m'ont dit que c'est scanf("%s", texte) qui est à bannir.
Merci![]()
Partager