Quand tu fais:
Code :
- printf ("Entrez le nombre de caracteres de votre phrase : " );
- scanf ("%d",&n);
|
Il reste un "\n" dans le buffer. Quand tu fais ensuite fgets, il voit ce "\n" et considère que c'est la chaine a lire, et retourne avec elle.
ca se voit très bien si tu remplace ton code par:
Code :
- printf ("Entrez le nombre de caracteres de votre phrase : " );
- if( fgets( phrase, 200, stdin) == NULL)
- printf( "fgets error\n" );
- else
- printf( "-->%s<--\n", phrase);
|
Il va donc falloir nettoyer stdin avant d'appeller fgets. Il semblerait logique de faire un fflush(stdin) avant le fgets, et ça marche très bien sous windows. MAIS, pour des raisons historiques, il ne faut pas faire fflush(stdin), car ça a un comportement indéfini [bon, ici ça marche, mais ça pourrait ne pas être le cas sous un autre environnement].
Donc il va falloir écrire une petite fonction de nettoyage:
Code :
- #define JUNK_BUFFER_SIZE 255
- void cleanup_stdin() {
- static char junk_buffer[JUNK_BUFFER_SIZE];
- char *s;
- int i = 0;
- while (s = fgets(junk_buffer, JUNK_BUFFER_SIZE, stdin)) {
- i = strlen(s);
- if ( (!i) || junk_buffer[i-1] == '\n')
- break;
- }
- }
|
et dans ton code, tu l'appèles après avoir lu stdin avec scanf:
Code :
- printf ("Entrez le nombre de caracteres de votre phrase : " );
- scanf ("%d",&n);
- cleanup_stdin();
|
et tout rentrera dans l'ordre.
La fonction de nettoyage de stdin lit tout ce qu'il reste dans stdin par tranches de 255 caractères ici, jusqu'a ce qu'il n'y ait plus rien ou bien que l'on ait (enfin) rencontré un '\n' (qui est alors a la fin de ce qu'on a lu par définition de fgets, d'ou le test junk_buffer[i-1] == '\n').
En résumé:
Code :
- #include <stdio.h>
- #include <string.h>
- #define JUNK_BUFFER_SIZE 255
- void cleanup_stdin() {
- static char junk_buffer[JUNK_BUFFER_SIZE];
- char *s;
- int i = 0;
- while (s = fgets(junk_buffer, JUNK_BUFFER_SIZE, stdin)) {
- i = strlen(s);
- if ((!i) || junk_buffer[i-1] == '\n')
- break;
- }
- }
- int main()
- {
- int n;
- char phrase [200];
-
- printf ("Entrez le nombre de caracteres de votre phrase : " );
- scanf ("%d",&n);
- cleanup_stdin();
- if ((n==0) || (n>200)) {
- printf ("Entrez un autre nombre de caractere pour votre phrase" );
- }
- printf ("Entrez votre phrase : " );
- fgets (phrase, 200, stdin);
- printf ("vous avez tape : %s", phrase);
- return 0;
- }
|
A+,
Message édité par gilou le 11-04-2010 à 12:59:20
---------------
There's more than what can be linked! -- Le capitaine qui ne veut pas obéir à la carte finira par obéir aux récifs. -- No jab ? No job ! -- (╯°□°)╯︵ ┻━┻