C语言中sizeof操作符与strlen函数的辨析

本文详细比较了sizeof操作符与strlen函数,探讨了它们的用途、实现方式以及在处理字符串长度时的注意事项,通过实例解析和代码示例加深理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引言:

本文围绕sizeof操作符与strlen函数展开,首先列出两者之间的区别,然后介绍了strlen函数的三种实现方法即递归,创建计数变量,指针相减,后分析练习打下基础,最后给出了一系列辨析二者区别的代码,并给出了详细的解释,以帮助我们加强对着二者区别的理解,然后总结了对于二者辨析的心得。

目录

引言:

sizeof与strlen的区别:

strlen函数的三种实现方法

实现效果:

第一种创建计数变量:

第二种使用指针相减:

第三种使用函数递归:

代码概览

辨析代码练习

热身组(基础回顾):

答案:

解释:

常规组(一维数组):

解释1:

答案2:

解释2:

答案3:

解释3:

答案4:

解释4:

超级组(二维数组)

答案:

解释:

总结:


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(&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值