Ben il fonctionne sous DevCpp car DevCpp c'est sous Windows et fflush(stdin) fonctionne sous Windows ???!!!
Le man est pourtant bien explicite (voir les phrases mises en gras par David Schris)
Version imprimable
Ben il fonctionne sous DevCpp car DevCpp c'est sous Windows et fflush(stdin) fonctionne sous Windows ???!!!
Le man est pourtant bien explicite (voir les phrases mises en gras par David Schris)
Rien de méchant dans mon commentaire, juste un rappel.Citation:
Envoyé par pimousse92
Moi non plus je ne lisais pas (assez) la doc. à mes débuts...et puis j'en ai eu marre de ne pas comprendre pourqoi ceci ou pourquoi cela...
Pour ce qui est de la FAQ, je ne sais pas.Citation:
Envoyé par pimousse92
Sauf que Dev-C++ c'est sous Windows et qu'un terminal sous Linux n'est peut-être (<-et c'est peu dire) pas géré de la même façon que sous Windows.Citation:
Envoyé par pimousse92
Donc, une fonction de plus haut niveau comme fflush() n'est probablement pas implémentée de la même manière.
D'après le man tu ne peux pas puisqu'il dit que c'est pour les flux ouverts en écriture.Citation:
Envoyé par pimousse92
aprés ces précisions, est-ce que je peux "accuser" mon utilisation de fflush sous linux ? :wink:
De toutes façons, tu peux accuser qui tu veux : ça n'a jamais fait mieux fonctionner un programme :wink:
Oui en effet c'est a cause de ca que ca ne fonctionnais pas.Citation:
Envoyé par pimousse92
Je reprends ton post initial.
Ton message ete affiché 2 fois car pour le scanf(%c", &rep); lorsque tu appui sur entrée pour confirmer la saisie le \n et mis dans le tampon et comme ton fflush ne fonctionnait pas lors du 2eme scanf rep prenait la valeur dans le tampon (\n).
En gros tu avais un scanf sur 2
fflush(stdin) est garanti marcher sous Windows, mais ce n'est pas défini par le standard et par conséquent, il y a des OS où ce n'est pas implémenté (par exemple, pratiquement (ou absolument) tous les unixoïdes...)
Vu qu on peut vider le buffer d'entree avec une simple boucle, il est plus propre de na pas utiliser fflush(stdin) du tout. Meme si ca marche.
(En plus comme ca c est portable :wink: )
C'est une extension MS-DOS Windows. Comme c'est pas portable, vu du C, ça n'existe pas, et il donc recommandé de ne pas pas l'utiliser, surtout que des solutions alternatives existent, à commencer par fgets() qui résout définitivement les problèmes de caractères non lus.Citation:
Envoyé par pimousse92
http://emmanuel-delahaye.developpez....tes.htm#saisie
http://emmanuel-delahaye.developpez....s.htm#fichiers
Citation:
Envoyé par Emmanuel Delahaye
et pour filtrer des lettres est-ce qu'il suffit de remplacer
parCode:ret = sscanf (saisie, "%[0-9-]s", temp);
Code:ret = sscanf (saisie, "%[a-z-]s", temp);
question préliminaire : j'utilises getchar pour faire une pause, est-ce correct ?
la question sur les flux :
j'utilises
plutot queCode:while ((x = getchar()) != '\n' && x != EOF);
pour vider le flux avant un getchar.Code:fflush(stdin);
(sans ça le prog ne fais pas de pause lorsque l'on utise getchar pour une deuxieme fois)
jusque là tout va bien sauf pour le premier getchar où je dois taper 2 fois sur entrée plutot qu'une... comment se fait-il ?
lien vers mon prog (voir le sous programme une_pause();
http://pastebin.com/429647
oui, c'est correct d'utiliser getchar()
fflush(stdin) n'est pas standard, ça ne marche pratiquement que sous windows
pour ne pas perdre le fil...Citation:
Envoyé par pimousse92
C'est possible, mais je ne connais pas assez bien scanf() pour répondre avec certitude.Citation:
Envoyé par pimousse92
Ca dépend de ce qu'il y a eu avant. Avec fgets(), c'est facilement prévisible et mesurable, avec scanf(), je ne sais pas faire. Je préconise d'utiliser exclusivement fgets() pour les saisies et donc d'avoir un conportement parfaitement et simplement prévisible.Citation:
Envoyé par pimousse92
Ca, ça sert à nettoyer le buffer stdin si on est sûr qu'il y a encore des restes... On s'en sert par exemple après un fgets() si on a pas trouvé le '\n'.Citation:
la question sur les flux :
j'utilises
Code:while ((x = getchar()) != '\n' && x != EOF);
Comme on se tue à te l'expliquer, ceci n'est pas défini par le langage C. Qu'il existe une extension non portable n'en fait évidemment pas une solution universelle. Formellement déconseillé.Citation:
plutot queCode:fflush(stdin);
Je préconise un usage maitrisé et exclusif de fgets(). Le reste, c'est trop fort pour moi et ça me prend la tête. Pas le temps pour ces c*nneries...Citation:
pour vider le flux avant un getchar.
(sans ça le prog ne fais pas de pause lorsque l'on utise getchar pour une deuxieme fois)
jusque là tout va bien sauf pour le premier getchar où je dois taper 2 fois sur entrée plutot qu'une... comment se fait-il ?
lien vers mon prog (voir le sous programme une_pause();
http://pastebin.com/429647
Dans mon interet, je vais revenir à des choses plus simples (je penses aux saisies) afin de mieux comprendre le C... J'ai bien compris mes maladresses même si je les ai remis sur le tapis, c'était en fait pour mieux exposer ma démarche initiale...
Est-ce que vous avez un lien qui m'explique comment faire une pause jusqu'à l'appui d'une touche du clavier ?
fgets(). On en sort par <enter>.Citation:
Envoyé par pimousse92