Encore les pointeurs ...

Résolu/Fermé
ax3000 Messages postés 8 Date d'inscription mercredi 29 janvier 2014 Statut Membre Dernière intervention 5 février 2015 - Modifié par Whismeril le 27/12/2014 à 22:48
jobertomeu Messages postés 1189 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 5 février 2015 - 5 févr. 2015 à 19:46
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 dimanche 19 août 2007 Statut Membre Dernière intervention 5 février 2015 86
4 févr. 2015 à 23:19
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 dimanche 19 août 2007 Statut Membre Dernière intervention 5 février 2015 86
Modifié par jobertomeu le 5/02/2015 à 00:04
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 843
5 févr. 2015 à 00:03
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 mercredi 29 janvier 2014 Statut Membre Dernière intervention 5 février 2015
5 févr. 2015 à 00:35
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 dimanche 19 août 2007 Statut Membre Dernière intervention 5 février 2015 86
5 févr. 2015 à 19:46
Si tu as des questions, n'hésites pas ! :)
0