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

Bibliothèque standard C Discussion :

Langage c : problème avec gets


Sujet :

Bibliothèque standard C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 5
    Points : 6
    Points
    6
    Par défaut Langage c : problème avec gets
    Bonjour, j'ai besoin d'aide pour débugger un petit programme que j'ai écris en langage c. Je pense que le problème est lié à une méconnaissance de la fonction "gets". Le but du code est de compter le nombre de lettre d'un texte écris sur plusieurs lignes. Pour connaître le nombre de lettre effectivement tapez en entrée il faut appuyer sur la touche "Entrée" 2 fois. Le programme doit compter les lettres de l'alphabet et les espace seulement. Le caractère nul '\0' et saut de ligne '\n' ne doivent pas être pris en compte.

    Exemple: si je tape sur une première ligne la chaine suivante : "azerty azerty" puis que je tape la touche "Entrée"
    Sur une seconde ligne j'écris la chaîne suivante "ytreza ytreza" puis que je tape sur la touche "Entrée" 2 fois pour que le programme finisse et me donne le résultat du nombre de lettre du texte tapé.
    Toutes les lettres on été compté 4 fois sauf le "y" qui lui est compté 3 fois. Si je fait un autre exemple sur 10 lignes, je m'aperçois que mon programme ne compte jamais le premier caractère d'une nouvelle ligne.


    Voici le programme:
    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
    45
    46
    47
    48
    49
    50
    #include <stdio.h>
    #define LGMAX 127
     
    int main()
    {
        char ascii[26], ligne[LGMAX+1];
        int nb[26], i, j, autre = 0, comptelettre = 0, espion = 0, nbcarac=0;
     
        for(i=0; i<26; i++)        nb[i]    = 0;
        for(i=0; i<LGMAX; i++)     ligne[i] = '#';
        for(i=0; i<26; i++)        ascii[i] = i + 97;
     
        printf("Donnez votre texte, en terminant par une ligne vide : \n");
     
        i = j = autre = 0;
     
     
     
        do
        {
            nbcarac=0;
            gets(ligne);
            printf("\n");
            putchar('\n');
     
            printf("\n");
            for (i=0;i<127 && ligne[i] != '\0';i++) nbcarac+=1;;
            printf("le nombre de caractere est : %d \nle 1ere lettre est %c\n", nbcarac, ligne[0]);
     
            for (i=0; i<127 /*&& ligne[i] != '\0' */&& ligne[i] != '\n'; i++)
                {
                    if (ligne[i] > 96 && ligne[i] < 123)    {comptelettre += 1;espion+=1;}
                    if ((ligne[i] < 97) || (ligne[i] > 122 && ligne[0] != '\n'))    {autre += 1; espion += 1;continue;}
     
                    for(j=0; j<26 && ligne[i] != '\0' && ligne[i] != '\n'; j++) if (ligne[i] == ascii[j])      {nb[j] += 1;}
                }
        }
        while(getchar() != '\n');
     
     
        printf("Votre texte comporte %d caracteres dont : \n", comptelettre);
     
        for(i=0; i<26; i++)     printf("%d fois la lettre %c\n", nb[i], ascii[i]);
     
        printf("\net %d autres caracteres\n", autre);
     
     
        printf("\n\n");
        return 0;
    }
    Si quelques bonnes âmes pouvaient m'expliquer l'erreur. Je tourne autour du programme depuis un bon moment, j'ai essayé différentes choses mais sans résultat.
    Merci.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 620
    Points
    23 620
    Par défaut
    Citation Envoyé par aurelien1606 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        do
        {
              ...
        }
        while(getchar() != '\n');
    Il est là, ton caractère manquant. getchar() consomme un caractère et est une fonction indépendante de fgets(). Ce qu'il aurait fallu faire plutôt, c'est faire le traitement de ta ligne dans tous les cas et ne boucler ensuite que si celle-ci avait une longueur non nulle. Or, la dernière chose que tu utilises dans ton bloc est une boucle for( ; ; ) qui vérifie entre autre si l'on n'a pas atteint le '\0'. Moralité, si i est non nul, c'est qu'au moins un caractère dans ta chaîne a été traité, et qu'il faut donc boucler. un while(i>0) devrait donc te tirer d'affaire.

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 116
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 116
    Points : 1 111
    Points
    1 111
    Par défaut
    En fait, il ne faut pas utiliser gets en toute rigueur, car cette fonction est mal conçue et peut conduire à des erreurs à l'exécution (débordement de tampon). Il faut toujours privilégier fgets, qui fixe une taille maximale de la ligne lue en entrée.

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Citation Envoyé par kromartien Voir le message
    En fait, il ne faut pas utiliser gets en toute rigueur, car cette fonction est mal conçue et peut conduire à des erreurs à l'exécution (débordement de tampon). Il faut toujours privilégier fgets, qui fixe une taille maximale de la ligne lue en entrée.
    Je préciserai , que gets provoque une faille de sécurité dans votre programme ( comme tout débordement de tampon )
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

Discussions similaires

  1. problème avec gets
    Par jaimelagalette dans le forum Débuter
    Réponses: 2
    Dernier message: 13/10/2009, 00h32
  2. Problème avec GET
    Par Menontona dans le forum VB.NET
    Réponses: 5
    Dernier message: 14/03/2009, 22h51
  3. [Cookies] Problème avec GET
    Par philippef dans le forum Langage
    Réponses: 6
    Dernier message: 08/03/2006, 15h56
  4. Problèmes avec gets
    Par al85 dans le forum C
    Réponses: 6
    Dernier message: 11/05/2005, 08h42
  5. problème avec GET DIAGNOSTICS
    Par hpghost dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 07/07/2004, 11h59

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