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 :
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,
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 !
Encore merci !
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question