您当前的位置:首页 > 计算机 > 编程开发 > C语言

C语言strlen()以NUL作为字符串结束标记,自定义一个字符串长度统计函数消除这个Bug

时间:12-29来源:作者:点击数:

我们知道,字符串长度统计函数 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;
}

运行结果:

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 明显超出了字符数组范围。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门