Langage c : problème avec Gets

Résolu/Fermé
Aurélien49 Messages postés 59 Date d'inscription lundi 28 janvier 2008 Statut Membre Dernière intervention 21 mai 2011 - 8 févr. 2009 à 11:54
Aurélien49 Messages postés 59 Date d'inscription lundi 28 janvier 2008 Statut Membre Dernière intervention 21 mai 2011 - 8 févr. 2009 à 15:12
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:
#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.
A voir également:

2 réponses

Je ne pense pas que le problème vienne de gets(ligne) (bien que cette fonction soit à prendre avec des pincettes) mais du while(getchar() != '\n'); qui consomme un caractère et ce sera donc le premier de la ligne suivante si ce caractère est différent du '\n'.
0
Aurélien49 Messages postés 59 Date d'inscription lundi 28 janvier 2008 Statut Membre Dernière intervention 21 mai 2011 3
8 févr. 2009 à 15:12
Merci à Loupius pour sa participation rapide et claire. En effet je n'avait pas pris en compte cette notion que le fait de faire un getchar(), allait consommer le premier élément de l'entrée standard, et que la fonction gets(ligne) serait remplit à partir du 2ème emplacement. J'ai résolut le problème en utilisant une fonction de la librairie <string.h>, en remplacent while(getchar() != '\n'); par
while(strlen(ligne)); Ce qui revient à tester simplement si "ligne" contient des caractères.

Le programme modifié:
#include <stdio.h>
#include <string.h> //1ère Modification
#define LGMAX 127

int main()
{
char ascii[26], ligne[LGMAX+1];
int nb[26], i, j, autre = 0, comptelettre = 0, espion = 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
{
gets(ligne);


for (i=0;i<127 && ligne[i] != '\0';i++)


for (i=0; i<127 && ligne[i] != '\n'; i++)
{
if ((ligne[i] > 96 && ligne[i] < 123) || ligne[i] == ' ') {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(strlen(ligne)); //2ème Modification


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;
}

Merci.
0