Langage c : problème avec Gets
Résolu
Aurélien49
Messages postés
59
Date d'inscription
Statut
Membre
Dernière intervention
-
Aurélien49 Messages postés 59 Date d'inscription Statut Membre Dernière intervention -
Aurélien49 Messages postés 59 Date d'inscription Statut Membre Dernière intervention -
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.
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:
- Langage c : problème avec Gets
- Langage ascii - Guide
- Langage binaire - Guide
- Pascal langage - Télécharger - Édition & Programmation
- Langage visual basic - Télécharger - Langages
- Langage basic gratuit - Télécharger - Édition & Programmation
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'.
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.
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.