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   -
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

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

jobertomeu Messages postés 1189 Date d'inscription   Statut Membre Dernière intervention   86
 
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);
}
0
jobertomeu Messages postés 1189 Date d'inscription   Statut Membre Dernière intervention   86
 
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);
}
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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,
0
ax3000 Messages postés 8 Date d'inscription   Statut Membre Dernière intervention  
 
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 !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jobertomeu Messages postés 1189 Date d'inscription   Statut Membre Dernière intervention   86
 
Si tu as des questions, n'hésites pas ! :)
0