C语言中让人容易采坑的sizeof()和strlen()

strlen()

strlen()是一种(计算字符串的长度)的库函数。它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)取决于传给strlen参数的首地址。开始扫描字符串直到\'0'结束,其返回值不包括'\0'。

函数声明

size_t strlen(const char* string);

头文件:string.h

参数:必是char*类型

返回类型size_t 是(unsigned int)字符串长度最少都是零,不可能是负数所以是(unsigned int)

示例1(vs2019 32位)

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "abcde";
	char arr2[] = {'a','b','c','d','e'};
	char arr3[] = { 'a','b','c','d','e','\0'};
	char arr4[] = { 'a','b','c','\0','d','e' };
	printf("%d\n",strlen(arr1));//5
	printf("%d\n", strlen(arr2));//随机值
	printf("%d\n", strlen(arr3));//5
	printf("%d\n", strlen(arr4));//3
	return 0;
}

  需要注意的是strlen在执行时直到找到'\0'才停下来

  在这里arr1是数组名,传给strlen的参数是首元素a的地址,strlen从a开始寻找'\0',找到'\0' 并返回(但不包括'\0') 从a到'\0'之间的字符串长度。所以第一个是5。

  arr2里面没有'\0' 所以strlen在执行时直到找到'\0'才停下来,这个位置是不确定的,在不同的编译器下的值是不一样的,所以是随机数。

那么和arr1一样的道理 在arr3和arr4不同位置下加入'\0'结果也是不同的

sizeof()

.sizeof() 是C中的关键字,它是一种单目操作符,而不是函数。其作用是根据所给的操作数,计算出操作数所占内存空间的大小,单位是字节(bit)。操作数可以是类型、指针、数组和函数等

示例2(vs2019 32位)

#include<stdio.h>
int main()
{
	int i = 0;
	int arr1[4] = { 0 };
	char arr2[] = "abcde";
	printf("%d\n", sizeof(i));//4
	//求的是int类型的大小 4 单位是字节
	printf("%d\n", sizeof(arr1));//16
	//求的是arr1数组的大小 数组有四个元素每个元素是int类型的大小
	//所以4*4 =16个字节
	printf("%d\n", sizeof(arr2));//6
	//求的是arr1数组的大小 数组有6元素每个元素是char类型的大小
     //所以6*1 =6个字节
	return 0;
}

需要注意的是arr1是数组名,但是当它单独放在sizeof的圆括号里面时
此时arr1就不是首元素的地址而是 整个数组 既sizeof求的是整个数组的大小
sizeof在求字符串的长度时包含了'\0',而strlen是没有包含'\0'

strlen() 和 sizeof()的用法示例3(vs2019 32位)

#include<stdio.h>
int main()
{
	//字符数组
	char arr[] = { 'a','b','c','d','e','f' };
	printf("%d\n", sizeof(arr));//6
	//arr单独放在()里,sizeof此时求的是种整个数组的大小
	//有6个元素每个元素为char类型 既6*1 
	//注意里面是否包含'\0' sizeof在计算时要包含'\0'
	printf("%d\n", sizeof(&arr));//4
	//&数组名(arr) 表示取出整个数组的地址
	 //在32位系统下指针的大小是4个字节
	//指针个变量,用来存放地址 sizeof此时求的是地址的大小 既 4
	printf("%d\n", sizeof(arr[1]));//1
	//arr[1]表示字符'b' sizeof此时求的字符'b'的大小
	//类型是char大小为 1
	printf("%d\n", strlen(arr));//随机值
	//printf("%d\n", strlen(*arr));//error
	// strlen的参数是char*类型 arr数组名表示首元素
	// a的地址通过*(解引用)找到的是字符'a'不符合strlen的参数要求
	//printf("%d\n", strlen(arr[1]));//error
	//arr[1]找到的是字符'b',不符合strlen的参数要求
	printf("%d\n", strlen(&arr));//随机值
	//&数组名(arr) 表示取出整个数组的地址
	//strlen从取出的地址开始寻找'\0' 直到找到'\0'才停下来,
  //这个位置是不确定的,在不同的编译器下的值是不一样的,所以是随机数
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值