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 :

gets() a la suite de scanf() -> probleme


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 24
    Points : 12
    Points
    12
    Par défaut gets() a la suite de scanf() -> probleme
    Bonjour.

    Je me suis récement rendus compte que l'utilisation de gets() a la suite de scanf() posait probleme, aucune valeur n etait demandé par gets().

    J'ai donc cherché dans mon grimoir magique et je pense que la raison est que : gets() prends pour valeur le "\n" que l'on tape innocement pour annoncer la fin de la saisie lors de l'utilisation de la fonctions scanf().

    La solution que j'ai trouvé est simlple, demander deux fois d affilé la valeur avec gets... :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char *ickis
     
    scanf(......)
    gets(ickis);
    gets(ickis);

    Si quelqun avait une meilleure solution a me fournir, je serais bien content
    MDS 97 - Visual C++ 5.0 - Win XP - C++ & C

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    il suffirait avant de faire ton gets de vider le buffer stdin

    Par contre mieux vaut utiliser fgets que gets pour des histoires de débordements

    Quand a scanf on la connait :il arretes la saisie au premeir espace etc etcx

    Pour repondre vide le buffer avant de faire le gets
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    la je comprends pas... fgets c'est pas pour lire dans un fichier?? Moi je parle saisie clavier.

    Et comment on le vite le buffer?
    MDS 97 - Visual C++ 5.0 - Win XP - C++ & C

  4. #4
    Membre expérimenté Avatar de alexrtz
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2003
    Messages
    639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2003
    Messages : 639
    Points : 1 359
    Points
    1 359
    Par défaut
    fpurge(stdin);
    ou
    __fpurge(stdin);
    "Je suis incapable d'expliquer ce qui se passa ensuite : je lâchai quelque chose, quelque chose à quoi je m'agrippais depuis toujours sans m'en rendre compte. Je m'enfonçais dans une obscurité chaude, moelleuse et protectrice, tandis qu'un loup montait la garde par mes propres yeux."

  5. #5
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par ickis
    la je comprends pas... fgets c'est pas pour lire dans un fichier?? Moi je parle saisie clavier.
    Tout d'abord gets ne lit pas forcement sur le clavier mais sur l'entree standard (qui est souvent le clavier mais peut aussi etre un fichier, un pipe, etc...). Il est possible d'utiliser cette entree standard via les fonctions fichier avec stdin comme fichier, ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fgets(buffer, n, stdin);
    a la place de

    n represente la taille maximale a lire

    Citation Envoyé par ickis
    Et comment on le vite le buffer?
    Question deja posee plusieurs fois : http://lfe.developpez.com/FAQ/C/?pag...buffer_clavier

  6. #6
    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 Re: gets() a la suite de scanf() -> probleme
    Citation Envoyé par ickis
    Je me suis récement rendus compte que l'utilisation de gets() a la suite de scanf() posait probleme, aucune valeur n etait demandé par gets().

    Si quelqun avait une meilleure solution a me fournir, je serais bien content
    L'utilisation de gets() est proscrite. Cette fonction est à l'origine de nombreuses attaques par 'buffer overflow'.

    Le mieux est d'utiliser fgets() et la fonction de conversion qui va bien : sscanf(), strto[u]l(), strtod() etc.

    De plus, fgets() lit le '\n', ce qui résoud le problème de gets() et scanf() qui laissent trainer les '\n' dans le flux d'entrée, causant des comportements étranges...
    Pas de Wi-Fi à la maison : CPL

  7. #7
    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 ickis
    la je comprends pas... fgets c'est pas pour lire dans un fichier?? Moi je parle saisie clavier.
    fgets() lit à partir d'un flux entrant. 'stdin' est souvent connecté au clavier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    {
       char buf [123];
     
       fgets (buf, sizeof buf, stdin);
     
    }
    Pas de Wi-Fi à la maison : CPL

  8. #8
    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 gl
    Citation Envoyé par ickis
    Et comment on le vite le buffer?
    Question deja posee plusieurs fois : http://lfe.developpez.com/FAQ/C/?pag...buffer_clavier
    Citation Envoyé par FAQ/C
    Une méthode plus sûre est celle proposée par Haypo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #include <stdio.h>
     
    int c;
    c = getchar&#40;&#41;;
    if &#40;c != '\n'&#41; while &#40;getchar&#40;&#41; != '\n'&#41;; /* mange le tampon */
    Attention, cette méthode est incomplète, car elle ne tient pas compte de EOF.

    La méthode courrament utilisée est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <stdio.h>
     
    void file_flush &#40;FILE *fp&#41;
    &#123;
       int c&#58;
       while &#40;&#40;c = fgetc&#40;fp&#41;&#41; != '\n' && c != EOF&#41;
       &#123;
       &#125;
    &#125;
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Eh bien je vous félicite et vous remiercie tous de votre participation a ce sujet
    MDS 97 - Visual C++ 5.0 - Win XP - C++ & C

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    huM...

    chez moi

    fgets (buf, sizeof buf, stdin);

    est soumise au meme probleme que

    gets(buf)


    et sans scanf avant, elle ne remplit pas la fonction de gets....
    MDS 97 - Visual C++ 5.0 - Win XP - C++ & C

  11. #11
    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 ickis
    chez moi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fgets &#40;buf, sizeof buf, stdin&#41;;
    est soumise au meme probleme que
    et sans scanf avant, elle ne remplit pas la fonction de gets....
    Peux tu poster le code exact qui pose problème, avec une description précise du problème ?
    Pas de Wi-Fi à la maison : CPL

  12. #12
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par ickis
    chez moi
    fgets (buf, sizeof buf, stdin);
    est soumise au meme probleme que
    gets(buf)
    Si tu parles du probleme que la fonction sors tout de suite, oui tu as encore le probleme car scanf a laisser un \n dans le flux d'entree, c'est normal. L'interet d'utiliser fgets par rapport a gets est que fgets prends un nombre maximum de caractere a lire ==> pas de debordement. Mais il faut quand meme vider le flux avant d'apeller fgets.

    Citation Envoyé par ickis
    et sans scanf avant, elle ne remplit pas la fonction de gets....
    Peux tu detailler un peu ca, je ne comprends pas trop ce que tu veux dire.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    ah si j'arrive a enregister des char avec fgets, désolé

    Encore merci
    MDS 97 - Visual C++ 5.0 - Win XP - C++ & C

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme Avec Scanf Et Gets !
    Par A_B dans le forum C
    Réponses: 11
    Dernier message: 09/03/2007, 22h20
  2. scanf gros probleme
    Par widguet dans le forum C
    Réponses: 9
    Dernier message: 28/12/2006, 20h00
  3. probleme avec methode get
    Par Tr@nkill dans le forum ASP
    Réponses: 2
    Dernier message: 12/05/2005, 14h54
  4. probleme avec driver ODBC DBASE suite a install SP
    Par bzh56 dans le forum Bases de données
    Réponses: 2
    Dernier message: 02/11/2004, 11h47

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