IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

scanf vs fgets


Sujet :

C

  1. #61
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    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.

  2. #62
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par _SamSoft_ Voir le message
    Je ne comprend pas, vous voulez que je fasse un copier-coller ? A quoi cela sert-il ?

    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.

  3. #63
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    Un simple aurait suffit !

    Si je presse 3x entrer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Example with bad functions
    str=
    2x : [sait-on jamais !]

    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...

  4. #64
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par _SamSoft_ Voir le message
    Un simple aurait suffit !
    J'ai mis la petite image, ...
    Si je presse 3x entrer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Example with bad functions
    str=
    ... mais j'aurais du mettre la grande. Je t'ai instamment demandé de faire le test avec mon programme tel quel (rien à modifier).
    Alors tu exécutes mon programme
    Apprends à suivre les consignes, sinon, on ne s'en sortira pas.

  5. #65
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    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

  6. #66
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par _SamSoft_ Voir le message
    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
    OK.

    Donc, ça fonctionne parfaitement. Tes délires sur fflush (stdin) sont donc injustifiés.

  7. #67
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    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

  8. #68
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par _SamSoft_ Voir le message
    Voilà mon code : (sûrement un problème dans le code. Je ne délire pas !)
    En retirant le system(CLEAR); (inutile), j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Example 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.
    Ce qui ne parait tout à fait conforme aux attentes. Alors c'est quoi le problème ?

    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);
      <...>

  9. #69
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Attention, dans le 2 ème cas, je conseille l'usage de fflush (stdout) pour être portable :
    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);
      <...>
    Je ne comprends pas en quoi le fait de rajouter fflush(stdout) augmente la portabilité? Peut tu m'expliquer s'il te plaît?

  10. #70
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Je ne comprends pas en quoi le fait de rajouter fflush(stdout) augmente la portabilité? Peut tu m'expliquer s'il te plaît?
    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=");

  11. #71
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    Merci Emmanuel Mais 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)

  12. #72
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par _SamSoft_ Voir le message
    Merci Emmanuel Mais 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)
    La suppression du system(CLEAR), c'est juste pour ne pas perturber l'écran (car j'en veux une copie). Ca n'a rien à voir avec le problème que tu évoques.

    Peux tu montrer un copié / collé de l'écran que tu obtiens avec ton programme ?

  13. #73
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    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...
    Si je garde fflush(stdin); de la fonction pause.

  14. #74
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    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=");
    Le flux standard de sortie est automatiquement vidé sur une lecture sur stdin donc le scanf vide stdout de toutes les manières alors à quoi bon?

  15. #75
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Le flux standard de sortie est automatiquement vidé sur une lecture sur stdin
    Tu peux le prouver ?

  16. #76
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    bien sur, c'est dans le bouquin de achille braquelaire p290 1er paragraphe.
    Cordialement.

  17. #77
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    bien sur, c'est dans le bouquin de achille braquelaire p290 1er paragraphe.
    Je respecte ce bouquin, mais je serais rassuré en le voyant écrit dans la norme...

  18. #78
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    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 :

    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’
    Rien ne dit que printf vide le buffer !

  19. #79
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Je respecte ce bouquin, mais je serais rassuré en le voyant écrit dans la norme...
    La je te comprend, faudrait lui poser la question pour connaitre ses sources.
    Parcontre samsoft je sais quel livre tu as mais on ne parle pas du même.

  20. #80
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par _SamSoft_ Voir le message
    Rien ne dit que printf vide le buffer !
    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.

Discussions similaires

  1. fgets + scanf et gestion des espaces
    Par Yunchi dans le forum Débuter
    Réponses: 7
    Dernier message: 02/03/2009, 15h35
  2. Scanf, fgets et buffer.
    Par SAKDOSS dans le forum Bibliothèque standard
    Réponses: 6
    Dernier message: 15/01/2008, 08h58
  3. PB avec scanf
    Par ché dans le forum C
    Réponses: 6
    Dernier message: 13/08/2003, 07h25
  4. [debutant]la fonction scanf
    Par kalaka dans le forum C
    Réponses: 7
    Dernier message: 01/07/2003, 15h15
  5. Réponses: 6
    Dernier message: 10/09/2002, 03h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo