引言:
本文围绕sizeof操作符与strlen函数展开,首先列出两者之间的区别,然后介绍了strlen函数的三种实现方法即递归,创建计数变量,指针相减,后分析练习打下基础,最后给出了一系列辨析二者区别的代码,并给出了详细的解释,以帮助我们加强对着二者区别的理解,然后总结了对于二者辨析的心得。
目录
sizeof与strlen的区别:
- sizeof是操作符,strlen是库函数,使用头文件<string.h>
- sizeof更关心的是操作数所占内存的大小,strlen是求字符串长度,统计的是'\0'前的字符个数
- sizeof不在乎内存中存放的数据,所以sizeof(int a+int b)不论括号内的值为多少,总是返回4,即sizeof中的表达式不计算,strlen关注内存中是否有‘\0’,如果没有'\0"就会一直向后寻找,从而出现越界。
strlen函数的三种实现方法
值得注意的几个易忽略点的是,strlen函数的返回值是size_t类型,即没有符号,这一点在后文中的辨析代码练习中会用到,同时strlen函数的参数是所求字符串的地址即const char*。以下是具体实现。
实现效果:
第一种创建计数变量:
assert断言防止所传p为空指针,同时p形参我们不希望所指向的值被修改,所以加const进行修饰。循环部分涉及指针加减一个整数跳过的大小由所指向的类型限制,最后count与函数返回的类型不符合,自动进行强制类型转化。
第二种使用指针相减:
涉及指针相减得到指针之间相差的元素个数
第三种使用函数递归:
函数的结束标志是p解引用为'\0','\0'的ASCII码值为0,取反后为真,否则进行函数递归,但应该注意栈溢出。
代码概览
//strlen函数的三种实现方法
#include<stdio.h>
#include<string.h>
#include<assert.h>
//计算变量
size_t j_strlen(const char* p)
{
assert(p);
int count = 0;
while (*(p+count))
{
count++;
}
return count;
}
//递归实现
size_t d_strlen(const char* p)
{
assert(p);
if (!*p)
{
return 0;
}
else
{
return 1 + d_strlen(p + 1);
}
}
//指针实现
size_t z_strlen(const char* p)
{
assert(p);
char* p1 = p;
while (*++p1)
;
return(p1 - p);
}
int main()
{
char arr[] = "上帝的归上帝,凯撒的归凯撒";
printf("计算变量:%zd\n", j_strlen(arr));
printf("递归实现:%zd\n", d_strlen(arr));
printf(&