Encore les pointeurs ...
Résolu
ax3000
Messages postés
8
Statut
Membre
-
jobertomeu Messages postés 1289 Statut Membre -
jobertomeu Messages postés 1289 Statut Membre -
Bonjour,
Je dois réaliser un programme qui compte le nombre de majuscules, minuscules, chiffres et caractères spéciaux dans une chaîne. Mais probablement à cause d'un problème de pointeur (et éventuellement dans une des fonction Est_Dans ou Est_Dans_N_Fois à voir ci après) je n'arrive pas à le faire tourner (il m'affiche que le nombre est de 0 sauf pour les caractères spéciaux quand je fais une phrase avec majuscules, minuscules, chiffres et caractères spéciaux). J'en viens enfin au code ! Le voici
EDIT: Ajout de la coloration syntaxique.
Merci déjà rien que pour le fait d'avoir pris le temps de tout lire ! :)
Je dois réaliser un programme qui compte le nombre de majuscules, minuscules, chiffres et caractères spéciaux dans une chaîne. Mais probablement à cause d'un problème de pointeur (et éventuellement dans une des fonction Est_Dans ou Est_Dans_N_Fois à voir ci après) je n'arrive pas à le faire tourner (il m'affiche que le nombre est de 0 sauf pour les caractères spéciaux quand je fais une phrase avec majuscules, minuscules, chiffres et caractères spéciaux). J'en viens enfin au code ! Le voici
main()
{
char *chaine;
int nbmaj, nbmin, nbchif, nbspec;
do
chaine= Lire_Chaine_Dynamique("Entrez votre chaine de caracteres:\n ");
while (chaine==NULL);
CompteNombreDE (chaine,&nbmaj,&nbmin,&nbchif, ec);
printf ("\n Le nombre de majuscule est de %d, celui de minuscule est de %d", nbmaj, nbmin);
printf ("\n Le nombre de chiffre est de %d, celui de caracteres speciaux est de %d \n ", nbchif, nbspec);
free(chaine);
//free(nbmaj); free(nbmin); free(nbchif); free(nbspec);
return 0;
}
//La fonction CompteNombreDe () dans son fichier.c :
void CompteNombreDe (char *chaine,int *nbmaj,int *nbmin,int *nbchif,int *nbspec)
{
int i,j;
char sep[]=" ,.!?;:[]#{(-_+)}/";
*nbmaj=0;
*nbmin=0;
*nbchif=0;
*nbspec=0;
for (i=0;i<strlen(chaine);i++)
{
if (chaine[i]>='A' && chaine[i]<='Z')
*nbmaj++;
else if (chaine[i]>='a' && chaine[i]<='z')
*nbmin++;
else if (chaine[i]>='0' && chaine[i]<='9')
*nbchif++;
else
{
for (j=0;j<strlen(sep);j++)
{
if ( Est_Dans(sep[j],chaine) == 1 )
*nbspec= *nbspec + Est_Dans_N_Fois (chaine,sep[j]);
}
}
}
}
//Les fonctions Est_Dans et Est_Dans_N_Fois dans leurs fichier.c :
int Est_Dans(char car, char phrase[])
{
int i;
for (i=0;i<strlen(phrase);i++)
{
if (car==phrase[i])
return 1;
}
return 0;
}
int Est_Dans_N_Fois (char phrase[], char car)
{
int i, compteur=0;
for (i=0;i<strlen(phrase);i++)
{
if (car==phrase[i])
compteur++;
}
return compteur;
}
EDIT: Ajout de la coloration syntaxique.
Merci déjà rien que pour le fait d'avoir pris le temps de tout lire ! :)
5 réponses
-
Salut,
je t'avouerai que je n'ai pas eu le courage de lire ton code, mais j'ai fait rapidement une petite version un peu plus compréhensible, à mon gout, mais qui se doit d'être bien plus optimisée, voici ma proposition :
typedef struct s_header { int maj; int min; int spec; int alpha; } t_header; int isMaj(char c) { return ((c >= 'A' && c <= 'Z') ? 1 : 0); } int isMin(char c) { return ((c >= 'a' && c <= 'z') ? 1 : 0); } int isSpec(char c) { int i; char sep[] = " ,.!?;:[]#{(-_+)}/°\'"; for (i = 0; i < strlen(sep); i++) { if (c == sep[i]) return (1); } return (0); } int isAlpha(char c) { return ((c >= '0' && c <= '9') ? 1 : 0); } void foundChar(t_header *header, char *str) { int i = 0; while (str[i]) { if (isMaj(str[i])) header->maj++; else if (isMin(str[i])) header->min++; else if (isSpec(str[i])) header->spec++; else if (isAlpha(str[i])) header->alpha++; i++; } } void initHeader(t_header *header) { header->maj = 0; header->min = 0; header->spec = 0; header->alpha = 0; } int main() { char *str = "Bonjour je suis John, j\'ai 42 ans et il fait 42°C"; t_header header; initHeader(&header); foundChar(&header, str); printf("Nombre de majuscules : %d\n", header.maj); printf("Nombre de minuscule : %d\n", header.min); printf("Nombre de char. spec. : %d\n", header.spec); printf("Nombre de char. alpha : %d\n", header.alpha); return (0); } -
Je me permet de reposter une autre version un peu plus aboutie mais nécessitant encore des motifs à faire de ta part ;).
typedef struct s_header { int maj; int min; int spec; int alpha; } t_header; void isMaj(t_header *header, char c) { header->maj += (c >= 'A' && c <= 'Z') ? 1 : 0; } void isMin(t_header *header, char c) { header->min += (c >= 'a' && c <= 'z') ? 1 : 0; } void isSpec(t_header *header, char c) { int i; char sep[] = " ,.!?;:[]#{(-_+)}/°\'"; for (i = 0; i < strlen(sep); i++) { if (c == sep[i]) header->spec += 1; } } void isAlpha(t_header *header, char c) { header->alpha += (c >= '0' && c <= '9') ? 1 : 0; } void initPointerTable(void (*pointerTable[3])(t_header *, char)) { pointerTable[0] = &isMaj; pointerTable[1] = &isMin; pointerTable[2] = &isSpec; pointerTable[3] = &isAlpha; } void foundChar(t_header *header, char *str) { int i = 0, j; void (*pointerTable[4])(t_header *, char); initPointerTable(pointerTable); while (str[i]) { j = 0; while (j < 4) pointerTable[j++](header, str[i]); i++; } } void initHeader(t_header *header) { header->maj = 0; header->min = 0; header->spec = 0; header->alpha = 0; } int main() { char *str = "Bonjour je suis John, j\'ai 42 ans et il fait 42°C"; t_header header; initHeader(&header); foundChar(&header, str); printf("Nombre de majuscules : %d\n", header.maj); printf("Nombre de minuscule : %d\n", header.min); printf("Nombre de char. spec. : %d\n", header.spec); printf("Nombre de char. alpha : %d\n", header.alpha); return (0); } -
Bonjour,
Mes remarques sur ton code :
Déjà, il manque les #include, et les prototypes des fonctions.
main()
Le bon prototype est : int main(void)
Lire_Chaine_Dynamique()
Il est où le code ? Dans une bibliothèque ?
CompteNombreDE (chaine,&nbmaj,&nbmin,&nbchif, ec);
Où est défini la fonction "ec" ?
//free(nbmaj); free(nbmin); free(nbchif); free(nbspec);
C'est en commentaire, mais tu peux le supprimer quand même. Aucune chance que ça marche.
*nbmaj++;
Attention aux priorités. Ici, ça sera plutôt : (*nbmaj)++;
N'oublie pas de corriger pour les autres variables.
Cdlt, -
Merci à tous, j'ai trouvé mon (mes) erreur(s), et maintenant ça roule (sans avoir utilisé le code de jobertomeu que j'avoue ne pas avoir entièrement compris). Quant à fiddy, évidemment j'avais mis les include je les ai juste pas copier coller ici, mais pour le reste bien vu :)
Encore merci ! -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -