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