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. #21
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    * Le 'continue' est inutile...
    * J'évite les accents dans les codes sources. Pas portable...
    J'utilise souvent 'continue' pour documenter une boucle sans instructions. Cette pratique me vient de Richard Heathfield dans "C Unleashed". Je trouve de toute manière cela bien plus clair et lisible que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ((c = fgetc(stdin)) != '\n' && c != EOF);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while ((c = fgetc(stdin)) != '\n' && c != EOF)
        ;
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ((c = fgetc(stdin)) != '\n' && c != EOF) {}
    Comme on le voit souvent. Maintenant, les questions de style... Je pourrais utiliser un commentaire à la place:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while ((c = fgetc(stdin)) != '\n' && c != EOF) 
    {
        /* This loop does nothing, absolutely nothing */
    }
    En ce qui concerne les accents, je ne les utilise que pour commenter mes code sur les forums de developpez...

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  2. #22
    Membre averti Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Points : 345
    Points
    345
    Par défaut
    Mise à jour :

    main.c
    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");
      getch();
      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");
      getch();
      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
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    #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)
    {
        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
                }
            }
        }
    }
    #endif //MYHEADER.H
    Donc j'ai bien configuré le compilateur et il me met un warning pour getch(); ce qui est tout à fait normal vu que je n'ai pas inclu conio ! Mais je ne trouve pas d'équivalent, bien sûr il y a system("PAUSE"); (du moins sous Windows) mais je n'aime pas le texte. Je préferai getch();
    Je l'ai quand même laissé.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Correction
    Citation Envoyé par Thierry Chappuis Voir le message
    J'utilise souvent 'continue' pour documenter une boucle sans instructions. Cette pratique me vient de Richard Heathfield dans "C Unleashed". Je trouve de toute manière cela bien plus clair et lisible que:
    <...>
    La boucle vide explicite (et développée) me va très bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while ((c = fgetc(stdin)) != '\n' && c != EOF) 
    {
    }
    Elle permet la maintenance (trace...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while ((c = fgetc(stdin)) != '\n' && c != EOF) 
    {
       PRINTF(("purge\n"));
    }
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #ifndef DBG
    #error DBG must be defined to 0 or 1
    #endif
     
    #if DBG
    #define PRINTF(a) printf a
    #else
    #define PRINTF(a)
    #endif
    dans le header qui va bien (dbg.h, par exemple...)
    En ce qui concerne les accents, je ne les utilise que pour commenter mes code sur les forums de developpez...
    What ? Tu publies du code non portable ? En cas d'ambigüité j'utilise ' ou ` après le caractère à accentuer.
    a`: à
    e' : é
    etc.
    Pas de Wi-Fi à la maison : CPL

  4. #24
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    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
    #ifndef DBG
    #error DBG must be defined to 0 or 1
    #endif
     
    #if DBG
    #define PRINTF(a) a
    #else
    #define PRINTF(a)
    #endif
     
     
    while ((c = fgetc(stdin)) != '\n' && c != EOF) 
    {
       PRINTF(("purge\n"));
    }
    N'y aurait-il pas un problème au niveau de la définition de PRINTF() pour DBG valant 1 étant donné l'utilisation qui en est faite?

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par _SamSoft_ Voir le message
    Mise à jour :
    Je vois que la leçon du conio ne t'as pas suffit...
    1. On ne met pas de code dans un header
    2. On inclue pas de .c

    La compilation séparée se fait ainsi :
    1. choisir un nom qui va bien (ici, je dirais 'saisie')
    2. créer un fichier d'interface (header) appelé "saisie.h"
    3. dans ce fichier, mettre
      • une protection contre les inclusion multiples
      • le nom du fichier /* saisie.h */
      • les prototypes séparés des fonctions
      • tout ce qui est nécessaire pour définir ces prototypes.
    4. créer un fichier d'implémentation "saisie.c"
    5. dans ce fichier mettre
      • le nom du fichier /* saisie.c */
      • un include de "saisie.h" en premier
      • les définitions des fonctions
      • tout ce qui est nécessaire à la définition des fonctions
    6. inclure "saisie.h" dans tous les fichiers qui utilisent les fonctions concernées.
    7. ajouter "saisie.c" au projet.

    Détails ici :

    http://emmanuel-delahaye.developpez.com/codage.htm

    (à lire de A à Z plusieurs fois si nécessaire. C'est dense...)
    Pas de Wi-Fi à la maison : CPL

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par stephl Voir le message
    N'y aurait-il pas un problème au niveau de la définition de PRINTF() pour DBG valant 1 étant donné l'utilisation qui en est faite?
    Quel genre de problème ?
    Pas de Wi-Fi à la maison : CPL

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Points : 345
    Points
    345
    Par défaut
    Pour conio: j'utilise la version que vous m'avez fournit donc je ne vois pas où est le problème Je vais lire ce que vous m'avez donné mais le fichier myHeader (je ne suis pas assez créatif pour trouver un bon nom) est tout à fait correct !

  8. #28
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Quel genre de problème ?
    Si je ne m'abuse, avec:
    La ligne:
    devient:
    et je ne vois pas trop l'intérêt. J'aurais plutôt fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #if DBG
    #define PRINTF(a) printf(a)
    #else
    #define PRINTF(a)
    #endif
    voire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #if DBG
    #define PRINTF(a) printf("%s",(a))
    #else
    #define PRINTF(a)
    #endif

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par _SamSoft_ Voir le message
    Pour conio: j'utilise la version que vous m'avez fournit donc je ne vois pas où est le problème
    Donc, tu as remarqué qu'il y avait 2 fichiers : conio.h et conio.c. Là, il faut faire pareil. J'ai tout expliqué. Tu suis les explications à la lettre et ça marche. Si tu ne les comprends pas, pose des questions.
    Je vais lire ce que vous m'avez donné mais le fichier myHeader (je ne suis pas assez créatif pour trouver un bon nom) est tout à fait correct !
    Non. On ne peux pas faire sérieusement de la compilation séparée si il n'y a pas au moins 2 fichiers séparés : un .h pour l'interface, un .c pour l'implémentation.

    Tu fais du C++, donc tu sais exactement de quoi je parle. (la définition des classes dans le .h et la définition des méthodes dans le .cpp correspondant).
    Pas de Wi-Fi à la maison : CPL

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par stephl Voir le message
    <...>J'aurais plutôt fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #if DBG
    #define PRINTF(a) printf(a)
    #else
    #define PRINTF(a)
    #endif
    Euh, presque. En fait, c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #if DBG
    #define PRINTF(a) printf a
    #else
    #define PRINTF(a)
    #endif
    Corrigé, merci.
    voire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #if DBG
    #define PRINTF(a) printf("%s",(a))
    #else
    #define PRINTF(a)
    #endif
    Euh, non...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PRINTF (("Count = %d\n", count));
    ne fonctionnerait pas...
    Pas de Wi-Fi à la maison : CPL

  11. #31
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PRINTF (("Count = %d\n", count));
    ne fonctionnerait pas...
    Oui, c'est juste. Désolé pour mon erreur, je n'avais songé qu'à une chaîne pour l'argument de PRINTF() mais rien n'interdit de passer plusieurs arguments de tout type avec votre définition (printf a).

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Points : 345
    Points
    345
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Donc, tu as remarqué qu'il y avait 2 fichiers : conio.h et conio.c. Là, il faut faire pareil. J'ai tout expliqué. Tu suis les explications à la lettre et ça marche. Si tu ne les comprends pas, pose des questions.
    Non. On ne peux pas faire sérieusement de la compilation séparée si il n'y a pas au moins 2 fichiers séparés : un .h pour l'interface, un .c pour l'implémentation.

    Tu fais du C++, donc tu sais exactement de quoi je parle. (la définition des classes dans le .h et la définition des méthodes dans le .cpp correspondant).
    Ah ! En effet, je vois maintenant de quoi vous voulez parler Je dois être hyper fatigué (quand même, mettre des fonctions toutes faites dans un h ) Donc là je vais mettre les prototypes dans le fichier h et les fonctions dans le C. Mais je n'ai pas compris pourquoi je ne dois pas utiliser votre conio ?

  13. #33
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    La boucle vide explicite (et développée) me va très bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while ((c = fgetc(stdin)) != '\n' && c != EOF) 
    {
    }
    Elle permet la maintenance (trace...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while ((c = fgetc(stdin)) != '\n' && c != EOF) 
    {
       PRINTF(("purge\n"));
    }
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #ifndef DBG
    #error DBG must be defined to 0 or 1
    #endif
     
    #if DBG
    #define PRINTF(a) printf a
    #else
    #define PRINTF(a)
    #endif
    dans le header qui va bien (dbg.h, par exemple...)
    What ? Tu publies du code non portable ? En cas d'ambigüité j'utilise ' ou ` après le caractère à accentuer.
    a`: à
    e' : é
    etc.
    Oui, je publie du code non portable (volontairement) sur ce forum. Je pense que la lisibilité et l'apprentissage y gagne. Mais j'essaierai de faire autrement à l'avenir (commentaires dans le texte et non dans le code).

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par _SamSoft_ Voir le message
    Mais je n'ai pas compris pourquoi je ne dois pas utiliser votre conio ?
    Bah, techniquement, tu peux, mais ce n'est pas portable...

    Si tu y tiens, utilise PDCurses (qui est multi-plateformes), mais est-ce vraiment utile pour le moment (révisions du C de base...)
    Pas de Wi-Fi à la maison : CPL

  15. #35
    Membre averti Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Points : 345
    Points
    345
    Par défaut
    Je reprend : Emmanuel->Pourquoi ne dois-je pas utiliser votre conio

    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");
      getch();
      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");
      getch();
      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
     
    #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);
    #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
     
    #include <stdio.h>
    #include <string.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
                }
            }
        }
    }

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par _SamSoft_ Voir le message
    Je reprend : Emmanuel->Pourquoi ne dois-je pas utiliser votre conio
    C'est pas 'mon' conio. C'est juste l'ancien d'un contributeur de Dev-C++ que j'ai corrigé, c'est tout...

    OK. Il ne reste plus qu'à créer la fonction pause() selon les indication déjà données...

    Je te donne le prototype :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void pause (char const *s_message);
    Si on passe NULL ou "" on n'affiche pas de message (évidemment)...
    Pas de Wi-Fi à la maison : CPL

  17. #37
    Membre averti Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Points : 345
    Points
    345
    Par défaut
    Entendu pour conio.

    Pour la fonction pause, je nage dans le néant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void pause(char const *s_message)
    {
         fprintf(stdout, "%c", *s_message);
         char c[256]="";
         fgets(c, sizeof c, stdin);
         fclean(c, stdout);
    }
    Merci d'avance

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par _SamSoft_ Voir le message
    Pour la fonction pause, je nage dans le néant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void pause(char const *s_message)
    {
         fprintf(stdout, "%c", *s_message);
     
         char c[256]="";
         fgets(c, sizeof c, stdin);
         fclean(c, stdout);
    }
    • Pourquoi n'afficher que le premier caractère ?
    • Que se passe-t-il si s_message vaut NULL ?
    • Pourquoi 256 caractères pour saisir un simple <enter> ?
    • Pourquoi tu passes stdout à fclean() ?
    • Tu programmes toujours au hasard comme ça, ou ça t'arrive de réflechir avant de coder ?
    Pas de Wi-Fi à la maison : CPL

  19. #39
    Membre averti Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Points : 345
    Points
    345
    Par défaut
    Désolé mais je débute (je viens de m'en rendre compte), je vais arranger tout ca

  20. #40
    Membre averti Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Points : 345
    Points
    345
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void pause(const char *s_message)
    {
        char c[256];
        if (strlen(s_message) != 0)
            fprintf(stdout, "%s", s_message);
        else if(s_message==NULL)
             fprintf(stderr, "Erreur avec le pointeur");
        fflush(stdin);
        fgets(c, sizeof c, stdin);
        fclean(c, stdout);
    }
    Un ami m'a aidé pour la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (strlen(s_message) != 0)
    Si je presse entrer c'est bon mais si j'appui sur une autre touche ca entre le caractère ce qui est tout à fait normal sachant que j'utilie fgets !
    Comment puis-je régler cela ?

    Merci d'avance

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