Encore les pointeurs ...
Résolu
ax3000
Messages postés
8
Date d'inscription
Statut
Membre
Dernière intervention
-
jobertomeu Messages postés 1189 Date d'inscription Statut Membre Dernière intervention -
jobertomeu Messages postés 1189 Date d'inscription Statut Membre Dernière intervention -
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 ! :)
A voir également:
- Encore les pointeurs ...
- Pointeurs photoshop problème ✓ - Forum Photoshop
- Pointeurs sur une structure dans une autre - Forum C
- Deux Pointeurs Souris Sous Windows ? ✓ - Forum Windows
- 2 pointeurs de souris sur un écran ✓ - Forum Windows
- Ma souris est folle! le pointeur se sauve dans tous les sens - Forum souris / Touchpad
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