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
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
A voir également:
- Langage c : problème avec Gets
- Langage ascii - Guide
- Langage binaire - Guide
- Pascal langage - Télécharger - Édition & Programmation
- Langage pascal - Télécharger - Édition & Programmation
- Dev-Pascal - 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'.
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
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.
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.