zephyre:
Il y a des finesses passées sous silence dans les réponses qui t'ont été faites. Une caractéristique de fgets() est que, si fgets() a la place de le faire, il va stocker le retour à la ligne '\n' lorsque l'utilisateur presse Entrée.
Si tu fais, comme dans ton code :
et que tu tapes "Albert" (6 lettres), prenom va en fait contenir :
{ 'A', 'l', 'b', 'e', 'r', 't', '\n', '\0' }
Si tu tapes "Philippe" (8 lettres), fgets termine la chaîne sans amputer les lettres composant le prénom, mais n'a pas la place de prendre le retour à la ligne (qui a aussi été tapé et que fgets() récupère s'il le peut), et prenom va alors contenir :
{ 'P', 'h', 'i', 'l', 'i', 'p', 'p', 'e', '\0' }
et '\n' va rester dans le tampon de stdin et sera lu au prochain appel à une fonction consommant le contenu du flux stdin.
De même, si tu tapes un mot plus grand qu'un mot de 8 lettres, '\n' ne sera pas présent dans la chaîne récupérée et sera laissé dans le tampon avec le reste des caractères non consommés.
Du coup, si tu veux te plaindre à l'utilisateur qu'il dépasse la capacité prévue, tu peux rechercher le retour à la ligne, avec strchr() par exemple. S'il n'y est pas, c'est que la saisie a au moins laissé '\n' dans le tampon de stdin, voire plus.
Si tu veux ignorer le reste de la saisie, tu dois purger le tampon. Une façon de faire est de faire alors ceci après fgets() :
1 2 3
| int c;
while((c = getchar()) != '\n' && c != EOF)
/* discard */ ; |
Tu le ne feras après fgets() que si la chaîne récupérée ne comprend pas '\n'.
Autre chose.
Avec fgets(), tu as donc compris que tu récupères une chaîne comme :
{ 'A', 'l', 'b', 'e', 'r', 't', '\n', '\0' }
du coup si tu fais
printf("Prénom : [%s]\n", prenom);
alors, tu vas afficher :
Si tu ne veux pas du retour à la ligne que fgets() intègre, il te faudra le supprimer : il y a différentes façons : https://stackoverflow.com/a/2693826/8138432
Partager