strlen(3)
Fonction de la bibliothèque C
Renvoie le nombre d'octets d'une chaîne C, sans compter l'octet nul final. Différence avec sizeof, octets et caractères, piège du size_t.
#include <string.h>
size_t strlen(const char *s);Description
strlen part de l'adresse s et compte les octets un par un jusqu'au premier '\0', qu'il ne compte pas. Une chaîne C ne stocke nulle part sa longueur : le seul moyen de la connaître est de la parcourir, donc le coût de strlen grandit avec la chaîne.
Valeur de retour
Le nombre d'octets qui précèdent l'octet nul, de type size_t. Il n'y a pas de valeur d'erreur : s doit désigner une chaîne terminée. Passer NULL, ou un tableau de char sans '\0', est un comportement indéfini, qui se termine souvent par un segmentation fault ou par la lecture de ce qui suit en mémoire.
Pièges
strlen et sizeof ne mesurent pas la même chose. Pour char mot[16] = "grademe";, strlen(mot) vaut 7, le texte, et sizeof mot vaut 16, le tableau. Sur un char *, sizeof donne la taille du pointeur, jamais celle du texte.
strlen compte des octets, pas des lettres. En UTF-8, é occupe deux octets, donc strlen("été") vaut 5.
Le résultat est un size_t, un entier non signé. strlen(a) - strlen(b) ne peut jamais être négatif : quand b est plus long, la soustraction fait le tour et donne un nombre énorme. Pour comparer deux longueurs, compare-les directement avec <.
Dans for (i = 0; i < strlen(s); i++), la condition rappelle strlen à chaque tour, qui reparcourt toute la chaîne. Si le compilateur ne sort pas lui-même cet appel de la boucle, le temps de calcul grandit avec le carré de la longueur. Calcule la longueur une fois, avant la boucle, ou teste s[i] != '\0'.
Après un strncpy(3) qui a tronqué, la destination n'a pas d'octet nul : strlen continue alors au-delà du tableau.
Exemple
#include <stdio.h>#include <string.h>
int main(void){ char mot[16] = "grademe";
printf("strlen(mot) = %zu, sizeof mot = %zu\n", strlen(mot), sizeof mot); printf("strlen(\"\") = %zu\n", strlen("")); printf("strlen(\"été\") = %zu\n", strlen("été")); printf("strlen(\"ab\") - strlen(\"abc\") = %zu\n", strlen("ab") - strlen("abc")); return 0;}$ gcc -Wall -Wextra longueur.c -o longueur$ ./longueurstrlen(mot) = 7, sizeof mot = 16strlen("") = 0strlen("été") = 5strlen("ab") - strlen("abc") = 18446744073709551615La dernière ligne vaut 2^64 - 1 : 2 - 3 calculé en size_t sur une machine 64 bits. Écrit dans un test if (strlen(a) - strlen(b) > 0), ce calcul serait vrai dans tous les cas où les longueurs diffèrent, y compris quand a est la plus courte.
strlen
Écris gm_strlen, qui compte les caractères avant l'octet nul final sans rien écrire dans la chaîne.