Partage

Longueur d'une chaine de caractères

Le 7 août 2010 à 23:09:13

Salut,
En étudiant la partie 3 du chapitre des chaine de caractère rédigé par M.M@teo21 , j'ai essayé de faire la fonction qui calcule la longueur d'une chaine de caractère avant de voir la correction.
ça marche pour moi maintenant, mais j'aimerais juste que quelqu'un me montre l'avantage de sa méthode, et le risque que court ma méthode..

#include <stdio.h>
#include <stdlib.h>

int fctTaille(char mot[]); // le prototype de la fonction qui calcule la taille d'une chaine de caractères

int main()
{
    char motSaisi[100]; // la déclaration d'un tableau de caractères dont le maximum est supposé être 100
    printf("veuillez entrer une chaine de caractere\n");
    scanf("%s", motSaisi); // l'utilisateur doit rentrer une chaine de caracteres
    printf("le nombre des caractere est : %d", fctTaille(motSaisi)); // supposé à avoir la tâche de montrer le nombre des caractères

    return 0;
}
int fctTaille(char mot[]) // la fonction qui doit normalement calculer le nombre des caractères
{

    int i=0;
    while(mot[i]!='\0') // sachant que toute chaine de caractère se termine par \0 , on impose l'entrée dans la boucle tant que la chaine de caractère n'a pas abouti sa fin
    {i++;} // l'ensemble des instructions ( ici, une seule ) lors de l'entrée dans la boucle
    return i; // le nombre finale après toute incrémentation possible
}


Citation : M@teo21

int longueurChaine(const char* chaine);

int main(int argc, char *argv[])
{
    char chaine[] = "Salut";
    int longueur = 0;

    longueur = longueurChaine(chaine);

    printf("La chaine %s fait %d caracteres de long", chaine, longueur);

    return 0;
}

int longueurChaine(const char* chaine)
{
    int nombreDeCaracteres = 0;
    char caractereActuel = 0;

    do
    {
        caractereActuel = chaine[nombreDeCaracteres];
        nombreDeCaracteres++;
    }
    while(caractereActuel != '\0'); // On boucle tant qu'on n'est pas arrivé à l'\0

    nombreDeCaracteres--; // On retire 1 caractère de long pour ne pas compter l'\0

    return nombreDeCaracteres;
}


Merci bcp d'avance!
j'en serai reconnaissante! :)
Publicité
Le 7 août 2010 à 23:09:13
Le 7 août 2010 à 23:15:00

A priori, il n'y a aucun risque avec ta méthode.

Si l'indentation était meilleur, je préférerais même ta version :) .

(Par contre, le paramètre n'est pas de type const char* chez toi, mais ce n'est pas très grave. Mais ça reste une bonne information pour les programmeurs qui utilisent ta fonction.)
Le 7 août 2010 à 23:24:28

Salut !
Je me demande si je ne suis pas hors de propos, mais il se trouve que si ta chaine de caractère n'a pas de '\0', les deux méthodes vont finir en buffer overflow.

A priori, ça n'arrive pas puisque scanf() le rajoute automatiquement, SAUF si le type qui utilise le programme décide que sa chaine de caractère fera plus de 100-1 (la place pour le '\0') caractères.

Bon évidemment, le cours de M@téo à ce moment là ne parle pas vraiment de ça (sauf à titre informatif) et l'idée n'est pas de coder un realloc() ^^
Donc en effet, avec un truc un peu plus joli dans le while de ta fonction, ça donnerait mieux que M@téo.
Le 7 août 2010 à 23:28:53

Comme l'a dit Tosh la version que tu as codée est bien.

Des petits détails :
Tu peux passer par une boucle for.
Si dans un bloc comme if, else if, else, for, while, tu n'as qu'une instruction, tu peux supprimer les crochets (ça reste une question de goût).

Pour finir, tu peux aussi recoder cette fonction sans passer par une variable i. Indice : *mot et mot.
Le 7 août 2010 à 23:38:02

Citation : quentin-fait-du-c


mais il se trouve que si ta chaine de caractère n'a pas de '\0'


Dans ce cas, ce n'est plus une chaîne valide! ;)

Une chaîne valide en C se termine toujours pas un '\0'.

Sinon, c'est juste un tableau de caractère, et aucune fonction de <string.h> ne peut fonctionner....
Zeste de Savoir, le site qui en a dans le citron !
Le 7 août 2010 à 23:42:55

Citation : GurneyH

Sinon, c'est juste un tableau de caractère



Oui j'ai amalgamé les deux parce que j'ai souvent à faire avec des trucs difformes de ce genre là. En fait, les chaines créées par des fonctions (scanf, fgets, toussa toussa) sont super bien formatées, mais celles qui sortent d'autres programmeurs ne sont pas forcément correctes, elles sont définies plutôt par un define de la longueur du tableau.
Enfin c'est mon expérience ça ^^ J'ai appris à être prudent, pour la santé de mon processeur !

Sinon, Tu as entièrement raison, une bonne chaine de caractères se termine par ce fameux \0.
Le 8 août 2010 à 16:02:18

Citation : new_life


ça marche pour moi maintenant, mais j'aimerais juste que quelqu'un me montre l'avantage de sa méthode, et le risque que court ma méthode..


L'implémentation de longueurChaine avec ses deux variables et son do while est inutilement compliqué, utilise le do while dans un cas où ne devrait pas l'être ; bref, exemple à ne pas suivre.

Longueur d'une chaine de caractères

× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
  • Editeur
  • Markdown