Peut être que fflush(stdout) n'est pas lié mais pourtant si je le remplace par fflush(stdin) ca fonctionne. Sinon fflush(stdin) ne fait pas rien ! En revanche, il a un comportement aléatoire comme l'a dit Emmanuel.
Peut être que fflush(stdout) n'est pas lié mais pourtant si je le remplace par fflush(stdin) ca fonctionne. Sinon fflush(stdin) ne fait pas rien ! En revanche, il a un comportement aléatoire comme l'a dit Emmanuel.
Un copié collé, ça permet de montrer exactement ce qui s'est passe sur l'écran.
Alors tu exécutes mon programme
Tu fais 2 <enter> [edit]
Copier :
Tu fais un click-droit sur la fenêtre de sortie (console)
Tu clickes sur 'sélectionner tout'. La couleur de l'écran doit s'inverser
Tu fais <enter>
Coller :
dans la fenêtre d'édition des posts de Développez,
Tu places des balises de code.
Tu vas entre les deux et tu fais <enter>
Tu fais <shift-ins> (ou click-droit : coller)
Ca doit donner 2 lignes vides et une ligne avec du texte.
Tu publies le message.
Un simpleaurait suffit !
Si je presse 3x entrer :
2x : [sait-on jamais !]
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Example with bad functions str=
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Example with good functions str = str2= str = str2 Appuyez sur une touche pour continuer...
J'ai mis la petite image, ...
... mais j'aurais du mettre la grande. Je t'ai instamment demandé de faire le test avec mon programme tel quel (rien à modifier).Si je presse 3x entrer :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Example with bad functions str=
Apprends à suivre les consignes, sinon, on ne s'en sortira pas.Alors tu exécutes mon programme
Je suis un ABRUTI !
J'ai pas lu : "execute mon programme"
Bon alors, je ne ferai pas de copier coller, ca sert à rien (j'ai tout en tête) :
2x Entrer:
rien
rien
Appuyez sur une touche...
3x
rien
rien
Appuyez...
Fermeture du prog
Non !
Voilà mon code : (sûrement un problème dans le code. Je ne délire pas !)
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
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 /* Name: fgets vs scanf Copyright: GPL Authors: Samy Hocine and some members of the C forum from developpez.com Date: 03/09/07 09:24 Description: Little code */ #include <stdio.h> #include <stdlib.h> #include <stddef.h> #include <string.h> #include "myHeader.h" int main(void) { //Example with good functions char str[256], str2[256]; puts("Example with good functions"); puts("str ="); fgets(str, sizeof str, stdin); fclean(str, stdout); puts("str2="); fgets(str2, sizeof str2, stdin); fclean(str2, stdout); if(strcmp (str, str2) == 0) puts("str = str2"); else puts("str != str2"); pause("Appuyez sur une touche pour continuer..."); system(CLEAR); //Example with a difficult functions reserved for good programmers puts("Example with bad functions"); printf("str="); scanf("%s", str); printf("str2="); scanf("%s", str2); if(strcmp (str, str2) == 0) puts("str = str2"); else puts("str != str2"); pause("Appuyez sur une touche pour continuer..."); return 0; } //So if you're a beginner, you should use fgets !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 #ifndef MYHEADER_H #define MYHEADER_H #ifdef WIN32 #define CLEAR "CLS" #elif defined (linux) #define CLEAR "clear" #else #error Not defined for this plateforme #endif void fclean(char *s_buffer, FILE *stream); void pause(char const *s_message); #endif //MYHEADER_H
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
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 #include <stdio.h> #include <string.h> #include <stddef.h> #include "myHeader.h" void fclean(char *s_buffer, FILE *stream) { if (s_buffer != NULL && stream != NULL) { char *pc = strchr(s_buffer, '\n'); if (pc != NULL) /* La saisie n'a pas été tronquée */ { /* On remplace '\n' par le caractère nul '\0' */ *pc = 0; } else { /* La saisie a été tronquée, on purge le flux d'entrée */ int c; while ((c = fgetc(stream)) != '\n' && c != EOF) { //Rien } } } } void pause (const char *s_message) { if (s_message != NULL && strlen (s_message) != 0) { fprintf (stdout, "%s", s_message); fflush (stdout); //If I write stdout, s_message is not visible ! } { char c[2]; fgets (c, sizeof c, stdin); fclean (c, stdin); } } PS: Demain j'ai cours :) Je vais éteindre le PC, je reviendrai sûrement ce week end (sur le forum) :D
En retirant le system(CLEAR); (inutile), j'obtiens :
Ce qui ne parait tout à fait conforme aux attentes. Alors c'est quoi le problème ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14Example with good functions str = abc str2= abc str = str2 Appuyez sur une touche pour continuer... Example with bad functions str=def str2=def str = str2 Appuyez sur une touche pour continuer... Press ENTER to continue.
Attention, dans le 2 ème cas, je conseille l'usage de fflush (stdout) pour être portable, car les chaines ne sont pas terminées par '\n' :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 <...> puts("Example with bad functions"); printf("str="); fflush (stdout); scanf("%s", str); printf("str2="); fflush (stdout); <...>
Ca a déjà été expliqué 3000 fois...
http://emmanuel-delahaye.developpez....#fflush_stdout
Ici, les chaines ne sont pas terminées par \n :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 printf("str="); printf("str2=");
Merci EmmanuelMais pourquoi le system(CLEAR); est lié à mon problème avec fflush(stdin); Je viens de tester et non, toujours le même problème pourtant j'ai fais comme vous aviez dit : suppression de CLEAR et mis en place de fflush(stdout)
PS: Coup de chance, je peux aller (en douce sur le pc)![]()
Si je garde fflush(stdin); de la fonction pause.Example with good functions
str =
t
str2=
t
str = str2
Appuyez sur une touche pour continuer...
Example with bad functions
str=test
str2=test
str = str2
Appuyez sur une touche pour continuer...
bien sur, c'est dans le bouquin de achille braquelaire p290 1er paragraphe.
Cordialement.
Loin de moi l'idée de dire que telle personne à tort ou a raison (à 15ans, je peux difficilement dire qu'Emmanuel se trompe sur ce coup là) mais j'ai là 3eme édition de ton bouquin sous les yeux (format pdf, tout à fait légal) et j'ai :
Rien ne dit que printf vide le buffer !14.6 Pourquoi mon printf ne s’affiche pas ?
Le flux standard stdout, sur lequel ´ecrit printf est bufferis´e. C’est `a dire que les caract`
eres sont ´ecrits dans un tampon (une zone m´emoire). Lorque celui-ci est plein, ou
lorsqu’une demande explicite est faite, il est vid´e dans le flux proprement dit (sur l’´ecran
g´en´eralement). Tant que le buffer n’est pas vid´e, rien ne s’affiche.
Pour vider le buffer, il y a trois possibilit´es :
– Le buffer est plein
– Il est vid´e explicitement par l’appel de la fonction fflush (cf. 14.4, page 76)
– La chaˆıne de caract`eres se termine par un ’\n’
Oui, ça, tout le monde est d'accord. Ce que dit Nicolas, c'est le scanf() suivant le printf() va forcer l'affichage. C'est possible, et dans ce cas précis, je suis d'accord que le fflush(stdout) est superflu.
Mais dans le cas général, nul ne peut affirmer qu'un printf() avec une chaine non terminée par un '\n' sera suivi d'un scanf(). La regle générale est donc de mettre un fflush(stdout) si la chaine n'est pas terminée par un \n.
Partager