Compter dans une chaine de carctere

s que vous pourié me donner une fonction qui compte le nombre de lettre d’une chaine de caractere
puis une qui compte le nombre de mot
en langage C
c assez urgent sil vous plai :??:

Non.

On ne fait pas le travail des autres (car perso, vu comment c’est tourné)

Si tu veux de l’aide, alors commence par essayer de réfléchir.

Et si tu veux, tu as isalpha, isalnum, isspace (ctype.h) qui t’aideront pour les mots.

Pour finir, je te prierai d’ajouter le langage © dans le titre de ton message

(ici pour éditer : http://www.clubic.com/forum/index.php?act=…5&p=6784233&st= )

si tu pense que g pas bossé dessu
peu etre que je me sui mal exprimer mais bon ca fait deux semaine que jessaye de trouver et que j’y arrive pas

Une chaine de caractères, en C, c’est ni plus ni moins qu’un tableau d’éléments valant de 0 à 255 (char = 1 octet, 2^8)

Calculer tout ce basar, c’est facile : tu fais un tableau de 256 éléments, et tu l’initialise à 0 :

int bidule[256] = {};

puis pour chaque caractères de ta chaîne :
++bidule[s[i]];

Pour les mots, même topo : suffit de définir quels caractères peuvent être dans un mot, ensuite c’est que de l’analyse.

il y a une fonction strlen(char * str) qui compte le nombre de caractere (lib : stdlib.h je crois)
pour compter les mots il va falloir te debrouiller.
par exemple :
parcourir la chaine de carac et chaque fois que tu rencontre un espace ou un point tu as un mot de plus.

Pour le lib de cette fonction, c’est string.h

strlen ne sert à rien ici. Suffit de vérifier que str[i] != ‘\0’ (ce que fait strlen)

Pas la peine de faire deux fois la même chose…

il veut le nombre de lettre pas l’occurence de chaque caractere

strlen est equivalent a faire une boucle while


int i = 0;
while(str[i++] != '\0');
return i;

J’ai mal lu en effet :slight_smile: (fatigue, etc)

Le strlen n’est pas specialement la bonne solution non plus, car on cherche a connaitre le nb de lettres, pas le nb de caracteres (enfin ca demande confirmation).

Il faudrait donc parcoucrir la chaine jusqu’a tomber sur ‘\0’ et a chaque pas: si c’est une lettre, j’incremente mon compteur de lettres. Si c’est un espace, j’incremente mon compteur de mots.
Il y a evidemment des cas specifiques a traiter(chaine commencant par un espace, 2 espaces a la suite,…)

exact jeanguy

du style:


void main(void)
{
int len = strtlen(chaine);
int i;
int cpt = 0;
for( i = 0; i < len; i++)
{
  if(isLettre(chaine[i])
       cpt++;
}
 printf("Il y a %d lettres dans la chaine %s",cpt,chaine);
}

//fonction equivalente a une autre dans ctype.h
//a voir : isalpha(char car) et isnum(char car)
 int isLettre(char car)
{
 if((car >= 'a' && car <= 'z') || (car >= 'A' && car <= 'Z') )
   return 1;
 else return 0;
}

deux erreurs :

  1. strlen
  2. isLettre

da :

unsigned int count_letter(const char* s) {
unsigned int i = 0;
unsigned int r = 0;
while ( s[i] != '\0' ) {
  if (isletter(s[i]) ) ++r;
  ++i;
}
return r;
}

possible j’ai ecrit ca a la va vite :wink:

Bon, en vrac, pour compter le nombre de lettres:


int Nombre_De_Lettre(const char* s)
{
    int i;
    int nbre_de_lettres;

    i = 0;
    nbre_de_lettres = 0;

    while(s[i] != '\0')
    {
        if(s[i] != ' ')
            nbre_de_lettres ++;
        i++;
    }

    return nbre_de_lettres;
}

Et pour compter le nombre de mots:


int Nombre_De_Mots(const char* s)
{
    int i,j;
    int nbre_de_mots;

    i = 0;
    nbre_de_mots = 0;

    // Ici, on enlève les espaces éventuels en début de chaine
    while(s[i] == ' ')
        i++;

    // La, tant qu'on est pas à la fin de la chaine, on recherche des mots
    while(s[i] != '\0')
    {
        j = i;

        // Et ici, on considère que les mots sont des chaines de caractères séparés par des espaces
        while(s[j] != ' ' && s[j] != '\0')
            j++;

        nbre_de_mots ++;
        i = j;
    }

    return nbre_de_mots;
}

C’est juste dommage de perdre un parcours de la chaine en faisant 2 fonctions :wink:

grumph :confused:

et isletter/isspace? :confused: