strlen travaille habituellement en comptant les caractères dans une chaîne jusqu'à ce qu'un \0 caractère. Canonique de la mise en œuvre serait:
size_t strlen (char*str){size_t len =0;while(*str !='
size_t strlen (char*str){size_t len =0;while(*str !='\0'){
str++;
len++;}return len;}
'){
str++;
len++;}return len;}
Il n'y a pas vraiment d'un bug dans la fonction, il fonctionne exactement comme indiqué.
Cela ne veut pas dire qu'il n'a pas de problèmes, à savoir:
si vous passer une "chaîne" qui n'ont pas de \0 à la fin, vous risquez de rencontrer des problèmes, mais, techniquement, ce n'est pas une chaîne C a et c'est votre faute.
vous ne pouvez pas mettre \0 caractères dans votre chaîne, mais, encore une fois, ce ne serait pas une chaîne C dans ce cas.
ce n'est pas la manière la plus efficace - vous pouvez stocker une longueur à l'avant de sorte que vous pourriez obtenir la longueur beaucoup plus rapide.
Mais aucun de ces bugs, ils ne sont que les conséquences d'une décision de conception.
Voir aussi cet excellent article par Joel Spolsky, où il traite de divers formats de chaîne et de leurs caractéristiques, notamment des chaînes C, Pascal chaînes et de la combinaison des deux, null Pascal chaînes, s'il en a un plus, dirons-nous, "coloré" terme pour eux 🙂
a d'Une chaîne C est défini comme une série de non-terminaison des caractères (c'est à dire, tout autre que \0) suivie par celle de terminator. Ainsi, cette définition n'autorise pas les deux intégrés terminateurs au sein de la séquence et des séquences sans une telle terminaison.
Ou, mettre plus, de façon succincte (conformément à la norme ISO):
Une chaîne de caractères est une séquence contiguë de caractères terminée par la première null
caractère.
strlen
travaille habituellement en comptant les caractères dans une chaîne jusqu'à ce qu'un\0
caractère. Canonique de la mise en œuvre serait:Il n'y a pas vraiment d'un bug dans la fonction, il fonctionne exactement comme indiqué.
Cela ne veut pas dire qu'il n'a pas de problèmes, à savoir:
\0
à la fin, vous risquez de rencontrer des problèmes, mais, techniquement, ce n'est pas une chaîne C a et c'est votre faute.\0
caractères dans votre chaîne, mais, encore une fois, ce ne serait pas une chaîne C dans ce cas.Mais aucun de ces bugs, ils ne sont que les conséquences d'une décision de conception.
Voir aussi cet excellent article par Joel Spolsky, où il traite de divers formats de chaîne et de leurs caractéristiques, notamment des chaînes C, Pascal chaînes et de la combinaison des deux, null Pascal chaînes, s'il en a un plus, dirons-nous, "coloré" terme pour eux 🙂
a d'Une chaîne C est défini comme une série de non-terminaison des caractères (c'est à dire, tout autre que
\0
) suivie par celle de terminator. Ainsi, cette définition n'autorise pas les deux intégrés terminateurs au sein de la séquence et des séquences sans une telle terminaison.Ou, mettre plus, de façon succincte (conformément à la norme ISO):