VII. c_strlen▲
VII-A. Prototype▲
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:
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.
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:
#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:
Ma chaine de caracteres !
=
25
char