C语言strlen()以NUL作为字符串结束标记,自定义一个字符串长度统计函数消除这个Bug
我们知道,字符串长度统计函数 strlen() 以NUL作为字符串结束标记,但是很不幸的是,有时候字符串并不以NUL结束,例如:
请大家编写一个安全的字符串长度统计函数,即使字符串未以NUL结尾,也不会出错。
注意:你需要向自定义函数传递一个参数,它的值就是字符串缓冲区的长度。
char strA[5] = {'1', '2', '3', '4', '5'};这个时候使用 strlen() 函数会出现莫名其妙的结果,因为 strlen() 会一直统计内存中的字符,直到遇到NUL,而什么时候遇到是不可预知的。
请大家编写一个安全的字符串长度统计函数,即使字符串未以NUL结尾,也不会出错。
注意:你需要向自定义函数传递一个参数,它的值就是字符串缓冲区的长度。
#include <stdio.h> #include <string.h> #include <stddef.h> /** * @function 安全的字符串长度函数 * * @param string 要计算长度的字符串 * @param size 字符串缓冲区长度 **/ size_t my_strlen( char const *string, size_t size ){ register size_t length; // 统计范围不超过 size for ( length = 0; length < size; length++ ) if( *string++ == '\0') break; return length; } int main(){ char strA[5] = {'1', '2', '3', '4', '5'}, strB[10] = "123456789"; // 对比 strlen() 和 my_strlen() 的结果 printf("The length of strA is %d -- By strlen()\n", strlen(strA) ); printf("The length of strA is %d -- By my_strlen()\n", my_strlen(strA, 5) ); printf("The length of strB is %d -- By strlen()\n", strlen(strB) ); printf("The length of strB is %d -- By my_strlen()\n", my_strlen(strB, 10) ); return 0; }运行结果:
The length of strA is 17 -- By strlen() The length of strA is 5 -- By my_strlen() The length of strB is 9 -- By strlen() The length of strB is 9 -- By my_strlen()注意:17 明显超出了字符数组范围。