VII. c_strlen▲
VII-A. Prototype▲
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 :
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.
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 :
#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