Encore les pointeurs ...

Résolu
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

  1. 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);
    }
    1. 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);
      }
      1. Contributeur
        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,
        1. 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 !