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

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

Etude 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 retourn la longueure de la chaîne de caractères passée en argument. Le "zéro de fin de chaîne" n'est pas inclus dans le résultat retourné lors de la fin de la fonction.

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

Si la chaîne 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 chaîne 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      : chaîne : Chaîne de caractères dont il faut calculer la taille.
   i      : entier : Variable d'incrémentation pour se déplacer dans la chaîne.
   taille : entier : Compteur de la taille de la chaîne.

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

La boucle quant à elle permet de parcourir la chaîne caractère par caractère tant que le caractère courant n'est pas égal au caractère de fin de chaîne. A 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 chaîne 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 êtres 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 chaîne que nous passons ensuite à notre fonction c_strlen qui stocke la taille de la chaîne 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.