IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Étude détaillée du module String de la libc


précédentsommairesuivant

VII. c_strlen

VII-A. Prototype

 
Sélectionnez
c_size_t c_strlen (const char * s);

VII-B. Description et comportement

La fonction c_strlen retourne la longueur de la chaine de caractères passée en argument. Le « zéro de fin de chaine » n'est pas inclus dans le résultat retourné lors de la fin de la fonction.

En cas d'échec ou de chaine vide, la fonction renvoie simplement la valeur 0 (zéro) !

Si la chaine de caractères ne contient pas de zéro de fin, le comportement de la fonction est indéterminé et peut éventuellement générer un plantage du programme, car il y a un risque de dépassement de la zone mémoire de la chaine passée en argument.

VII-C. Algorithme

Voici un algorithme possible pour la fonction c_strlen :

 
Sélectionnez
algorithme
   fonction c_strlen (s:chaîne):entier
      début
         taille <- 0
         i <- 0
 
         tant que s[i] différent de '\0' faire
            taille <- taille + 1
            i <- i + 1
         ftant
 
         retourne taille
      fin
 
lexique
   s      : chaine : Chaine de caractères dont il faut calculer la taille.
   i      : entier : Variable d'incrémentation pour se déplacer dans la chaine.
   taille : entier : Compteur de la taille de la chaine.

L'algorithme est très simple : dans un premier temps nous déclarons des variables entières pour stocker la taille de la chaine et la position sur le caractère courant de la chaine.

La boucle quant à elle permet de parcourir la chaine caractère par caractère tant que le caractère courant n'est pas égal au caractère de fin de chaine. À chaque itération de la boucle, les variables taille et i sont incrémentées de 1.

Une fois le caractère de fin de chaine trouvé, la boucle se termine et la fonction renvoie la valeur de la variable taille !

Complexité temporelle dans le pire des cas :

Parcours simple de la boucle taille fois: complexité en O(taille)

VII-D. Implémentation

Dans notre implémentation, nous allons un peu réduire l'algorithme ci-dessus, car certaines opérations peuvent être effectuées dans la même instruction grâce à l'arithmétique des pointeurs.

 
Sélectionnez
c_size_t c_strlen (const char * s)
{
   c_size_t size = 0;
 
   while (*s++)
   {
      size++;
   }
 
   return size;
}

La condition de la boucle se trouve donc accompagnée d'une instruction d'incrémentation qui incrémente la position du pointeur après avoir lu le caractère courant ce qui nous évite surtout de déclarer une variable supplémentaire comme il est indiqué dans l'algorithme. Nous utilisons pour valeur de retour le type c_size_t au lieu d'un simple entier, car ce type est prévu à cet effet.

VII-E. Tests

Testons notre fonction avec un programme simple. Nous déclarons une chaine que nous passons ensuite à notre fonction c_strlen qui stocke la taille de la chaine dans la variable size. Pour finir notre court programme, nous affichons cette valeur avec la fonction printf :

 
Sélectionnez
#include "c_string.h"
#include <stdio.h>
 
 
int main (void)
{
   const char * str  = "Ma chaine de caracteres !";
   c_size_t     size = c_strlen (str);
 
   printf ("%s = %d char\n", str, size);
 
   return 0;
}

Nous avons donc si tout va bien, le résultat suivant :

 
Sélectionnez
Ma chaine de caracteres ! = 25 char

précédentsommairesuivant

Copyright © 2007 Franck Hecht. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.