我们知道,字符串长度统计函数 strlen() 以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;
}
运行结果:
注意:17 明显超出了字符数组范围。