C语言学习笔记---strlen()函数和sizeof()函数

712 阅读3分钟

「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战」。

  strlen() 函数和 sizeof() 函数通常都可以用来计算数组或者字符串的长度。在使用的时候很容易混淆。下面就通过几个简单的示例来看一看这两个函数的具体差别。

int main()
{
	char str[]={1,2,3};
	int cnt = 0;
	
	cnt = strlen(str);
	printf("strlen:%d\r\n",cnt);
	
	cnt = sizeof(str);
	printf("sizeof:%d\r\n",cnt);
	

	system("pause");
	return 0;
}

  定义一个数组,然后分别使用strlen() 函数和 sizeof() 函数计算数组长度然后打印出来。 在这里插入图片描述   这两个函数计算出来的长度是一样的,下来将整数数组改为字符串。

int main()
{
	char str[]="123";
	int cnt = 0;
	
	cnt = strlen(str);
	printf("strlen:%d\r\n",cnt);
	
	cnt = sizeof(str);
	printf("sizeof:%d\r\n",cnt);
	

	system("pause");
	return 0;
}

在这里插入图片描述   将数组改为字符串之后,通过 sizeof() 函数计算出来的长度比strlen() 函数计算出来的长度多1。由于字符串的末尾是以字符'\0'结束的。由此可见sizeof() 函数计算的长度应该是把结束字符也计算进去了,strlen() 函数计算的长度只是单纯计算了有效字符的长度。

  上面的数组中没有指定长度,将数组长度固定之后在测试。

int main()
{
	char str[10]="123";
	int cnt = 0;
	
	cnt = strlen(str);
	printf("strlen:%d\r\n",cnt);
	
	cnt = sizeof(str);
	printf("sizeof:%d\r\n",cnt);
	
	system("pause");
	return 0;
}

  将数组长度固定为10,然后测试,输出结果如下:

在这里插入图片描述

  通过 sizeof() 函数计算出来的长度为10,是数组真正占内存的大小。通过strlen() 函数计算出来的长度是1,是有效字符串的长度。

  由此可见 sizeof() 函数在计算长度的时候,计算的是数据类型在内存中占用的空间大小。不管当前存储的数据是否有效。而strlen() 函数计算的是有效字符占用的空间大小。

  所以通常使用strlen() 函数计算字符串的长度,使用sizeof() 计算数据类型占用空间的长度。使用比较多的就是用它来计算数组的长度。

  下面使用sizeof() 函数计算数组长度

int main()
{
	int val[]= {8,7,6,5,4,3,2};
	int cnt = 0,cnt1 = 0,cnt2 = 0;

	cnt1 = sizeof(val);
	cnt2 = sizeof(val[0]);
	
	cnt = cnt1 / cnt2;	
	
	printf("sizeof:%d,%d,%d\r\n",cnt1,cnt2,cnt);

	system("pause");
	return 0;
}

打印结果如下: 在这里插入图片描述

  通过打印结果可以看出cnt1为28,也就是整个数组在内存空间中所占的大小,cnt2值为4,是数组中第一个元素在内存中的空间大小。因为整形在在内存中占4个字节。所以数组的长度就是整个数组占用的空间大小除以每个字节的占用空间大小,计算出数组的长度为7。

  那么能不能也用strlen() 计算数呢?将上面代码中的sizeof 替换为 strlen。

在这里插入图片描述

  替换完成后编译器直接报错,提示strlen参数不能为int类型,由此可见,strlen()函数只能用于字符串中,对于其他类型的数组,要计算其长度,只能用sizeof ()函数。