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 :

Probleme avec la fonction gets


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 16
    Points : 11
    Points
    11
    Par défaut Probleme avec la fonction gets
    Bonjour a tous,

    Voila je fais du C depuis peu et pour cela j'utilise code::blocks, jusque la pas trop de problem, mais je fais un programme ou j'utise la fonction gets et il me met une erreur, du a cette fonction :
    le code :
    gets (ZL);

    l'erreur:
    main.c:70: AVERTISSEMENT: the `gets' function is dangerous and should not be used.
    :: === Build finished: 1 errors, 0 warnings ===

    pourtant dans mon prog il a bien les bibliotheques #include <string.h>, <stdlib.h> et <stdio.h>.

    Pouvez vous m'expliquer pourquoi cette erreur apparait?

    Et en meme temps pouvez me dire aussi si pour utiliser la fonction "malloc", il faut une biliotheque particuliere.

    merci de votre aide

  2. #2
    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
    gets() ne peut pas vérifier que le buffer passé en paramètre est suffisamment grand pour recevoir la chaîne. Préférez fgets().
    Pour utiliser malloc(), il suffit d'inclure <stdlib.h>

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par stephl
    gets() ne peut pas vérifier que le buffer passé en paramètre est suffisamment grand pour recevoir la chaîne. Préférez fgets().
    Pour utiliser malloc(), il suffit d'inclure <stdlib.h>
    Oui, gets devrait être interdie d'utilisation !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  4. #4
    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 figo7
    pourtant dans mon prog il a bien les bibliotheques #include <string.h>, <stdlib.h> et <stdio.h>.
    Attention, il s'agit de fichiers d'en-tête (header). Une bibliothèque c'est autre chose et ça concerne l'éditeur de liens (linker).

    http://emmanuel-delahaye.developpez....m#bibliotheque
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    salut stphl,

    j'ai utilise fgets, comme tu m'as conseillé, mais le probleme continue, ne serais pas un probleme interne a code::blocks???
    je ne sais pas si gets deverait etre interdit ou pas, en tout cas mon prof y tien j'ai l'impression, et comme a la fac on utilise visual studio gets ça ne pose pas de probleme.
    Mais chez moi et sur mon portable j'ai preferé code::blocks a visual studio.

    Alors que faire avez vous une idee

  6. #6
    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
    Voulez-vous dire que vous obtenez toujours cet avertissement avec fgets()???
    Je pense que même avec code::blocks, il doit y avoir moyen de désactiver ce warning. En outre, cela ne devrait pas empêcher la création de l'exécutable.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Oui j'ai toujours une erreur


    voila erreur


    main.c:70: error: too few arguments to function ‘fgets’
    :: === Build finished: 1 errors, 2 warnings ===

  8. #8
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Heu non, ce n'est pas possible que l'utilisation de fgets produise un message du genre:
    main.c:70: AVERTISSEMENT: the `gets' function is dangerous and should not be used.
    :: === Build finished: 1 errors, 0 warnings ===
    Pour les saisies utilisateurs et les lectures ligne par ligne des fichier je n'utilise que cette fonction et n'ai jamais eu ce problème ! Au passage, Code::Blocks n'y est pour rien, ce n'est qu'un EDI, c'est le compilateur qui est en faute ... enfin en faute c'est un grand car c'est un warning et donc c'est plutôt un bienfaits !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  9. #9
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par figo7
    Oui j'ai toujours une erreur


    voila erreur


    main.c:70: error: too few arguments to function ‘fgets’
    :: === Build finished: 1 errors, 2 warnings ===
    Comment utilises-tu cette fonction ? Cette erreur signifie que tu ne passes pas assez d'arguments à la fonction !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char * fgets (char * s, int size, FILE * stream);
    Voir la page man: fgets
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  10. #10
    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 Franck.H
    Au passage, Code::Blocks n'y est pour rien, ce n'est qu'un EDI, c'est le compilateur qui est en faute ...
    Je le sais. Je voulais juste parler d'une sorte de case à cocher dans les menus de l'IDE qui demanderait au compilateur de ne pas générer ce warning.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    J'ai ne peu pas creer d'executable avec cette erreur.

  12. #12
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par stephl
    Je le sais. Je voulais juste parler d'une sorte de case à cocher dans les menus de l'IDE qui demanderait au compilateur de ne pas générer ce warning.
    Ok, mais même si une telle option existe (que je ne connais pas) ce serait un tort de la désactiver à moins de s'enfoutre totalement des normes, etc... !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    voila le code :

    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
    void SAISIE (struct CHANS *T[],int *n)
    {
        int i;
        char ZL[41];    //Zone de Lecture
        struct CHANS *ptr;
     
        ptr = (struct CHANS *) malloc (sizeof(struct CHANS));
        printf("Donner le nom de la chanson\n");
        fgets (ZL);  //saisie du nom la chanson
        ptr -> cnom = strdup(ZL);
        ptr -> ctype = getchar();
        scanf("%d",&(ptr -> cnb));
        fflush(stdin);
        for(i=*n-1;i>=0 && strcmp(ZL,T[i]->cnom)<0;i=i-1)
     
            T[i+1]=T[i];
            T[i+1]=ptr;
        *n=*n*1;
    }

  14. #14
    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 figo7
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    main.c:70: error: too few arguments to function ‘fgets’
    :: === Build finished: 1 errors, 2 warnings ===
    Ben oui. Quand on te propose une fonction nouvelle, il faut lire sa doc...

    fgets() ne remplace pas gets() 'pin to pin'. Il y a deux paramètres de plus, il faut tester la présence du '\n', agir en conséquence... Les saisies en C, c'est assez complexe...

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

    NOTA : Si on décide de traiter correctement les entrées, c'est du 100%. Pas question de laisser trainer un gets() ni un scanf() ni un getchar()...
    Pas de Wi-Fi à la maison : CPL

  15. #15
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut


    Je t'est montré un peu plus haut (tu ne l'as peut-être pas encore lu) le prototype de fgets !

    Utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fgets (buffer, taille, flux
    flux qui peut être un fichier ou un flux standard comme stdin .
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  16. #16
    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 Franck.H
    Ok, mais même si une telle option existe (que je ne connais pas) ce serait un tort de la désactiver à moins de s'enfoutre totalement des normes, etc... !
    Chacun son avis. Voulez-vous dire que la norme implémente gets() mais interdit de l'utiliser? Ce serait plutôt comique.

  17. #17
    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
    Chacun son avis. Voulez-vous dire que la norme implémente gets() mais interdit de l'utiliser? Ce serait plutôt comique.
    La norme n'interdit pas de l'utiliser. Mais le bon sens, si.
    Pas de Wi-Fi à la maison : CPL

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Excuse moi Franck.H, mais je n'ai toujours pas compris comment resoudre le probleme, .

    desolé

  19. #19
    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 figo7
    je n'ai toujours pas compris comment resoudre le probleme <...>
    Il faut apprendre à faire des saisies correcte en C. Je t'ai indiqué des pistes.
    Pas de Wi-Fi à la maison : CPL

  20. #20
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par figo7
    Excuse moi Franck.H, mais je n'ai toujours pas compris comment resoudre le probleme, .

    desolé
    On t'a pourtant donné tout ce qu'il te faut savoir Qu'est-ce que tu ne comprend pas ?
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

Discussions similaires

  1. probleme avec les fonction get et set
    Par Invité dans le forum Flex
    Réponses: 0
    Dernier message: 23/01/2008, 14h44
  2. Probleme avec la fonction rename()
    Par TheZenZen dans le forum C
    Réponses: 6
    Dernier message: 08/10/2005, 15h59
  3. [LG] Problème avec la Fonction ReadLn en fin de programme
    Par killermano dans le forum Langage
    Réponses: 6
    Dernier message: 23/07/2005, 15h16
  4. [LG]Probleme avec une fonction
    Par xavier1936 dans le forum Langage
    Réponses: 7
    Dernier message: 08/02/2005, 22h48

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