
前言:本文是作为专栏内容的知识补充,也会放在《C语言》的专栏里面,有兴趣的友友们可以看看,笔者会在专栏更新C语言的学习笔记、常见问题解析!
传送门:C语言
说明:在c语言中我们在求解字符串和字符数组长度时候总会用到两个关键字sizeof和strlen。这两个很容易把他们搞错,因此笔者在这介绍一下这两者使用区别与注意事项。这里主要对象是数组。
在计算机中,计算机可读入的是含有二进制的数也就是只包含1和0这两个数字,当我这里二进制位有一个0或者1要存储的时候,如下图,我们这里需要存储二级制位1,计算机给它开辟了一个空间,我们把存储一个数字1的单位叫做计算机的最小单位:bit(比特位,简称位),8个比特位构成一个字节(byte)——

在遍历数组的时候,我们经常想知道数组的元素个数,那C语言中有办法使用程序计算数组元素个数吗?我的回答是:有的兄弟有的,可以使用sizeof。
sizeof 中C语言是⼀个关键字,是可以计算类型或者变量大小的,其实 sizeof 也可以计算数组的 大小。比方说:
#include <stido.h>
int main()
{
int arr[10] = {0};
printf("%d\n", sizeof(arr));
return 0;
}这里输出的结果是40,计算的是数组所占内存空间的总大小,单位是字节,也就是8个bit。
我们知道数组中所有元素的类型都是相同的,那只要计算出一个元素所占字节的个数,数组的元素个数就能算出来。这里我们选择第一个元素算大小就可以。
#include <stido.h>
int main()
{
int arr[10] = {0};
printf("%d\n", sizeof(arr[0]));//计算⼀个元素的⼤⼩,单位是字节
return 0;
}接下来就能计算出数组的元素个数:
#include <stido.h>
int main()
{
int arr[10] = {0};
int sz = sizeof(arr)/sizeof(arr[0]);
printf("%d\n", sz);
return 0;
}这里的结果是:10,表示数组有10个元素。
再比如说:
#include<stdio.h>
int main()
{
//sizeof计算占用内存空间大小时,会计算'\0'的大小
int arr1[10]={1,2,3,4,5};
char arr2[]="hello";//字符串后默认有个'\0'
char arr3[]={'h','e','l','l','o'};//字符后没有'\0'
int arr4[]={0};
printf("%d\n",sizeof(arr1));
printf("%d\n",sizeof(arr2));
printf("%d\n",sizeof(arr3));
printf("%d\n",sizeof(int));
return 0;
} 以后在代码中需要数组元素个数的地方就不用固定写死了,使用上面的计算,不管数组怎么变化,计算出的大小也就随着变化了。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "abcd";
char arr2[] = { 'a','b','c','d' };
int len1 = strlen(arr1);
int len2 = strlen(arr2);
printf("%d\n", len1);
printf("%d\n", len2);
return 0;
}
注意:strlen在测字符串长度时候遇到’\0’,结束。
strlen是一个求字符串长度的一个库函数,注意只是求字符串长度的一个函数,只针对字符串,不能求其他类型变量的长度! 它在使用求解字符串长度的时候,从参数给定的位置一直向后寻找’\0’,统计’\0’之前出现字符的个数。它的头文件是string.h,在使用的时候需要对它进行包含头文件。
1.sizeof是一个运算符号,是一个单目操作符;strlen作为C语言标准库函数,使用需要包含头文件<string.h>;
2.strlen计算的是'\0'之前的字符个数,sizefo计算的是所占空间内存的大小,单位是字节(bit);
3.strlen计算时不包含'\0',而sizeof包含'\0',若sizeof计算结果是n,那strlen计算的结果就是n-1;
4.strlen遇到'\0'才结束——
针对3、4的详解:strlen测量的只是字符串的实际长度,以’\0’结束,返回结果不包括’\0’。统计的是 \0 之前字符的个数,而sizeof测量的是字符的总元素的空间大小,包括’\0’转义字符的单位大小,其参数可以是数组、指针、类型、对象、函数等等;
5.sizeof的类型是unsigned int ,是一个无符号的整型;
6.strlen只能用char做参数,sizeof可以用类型做参数;
7、sizeof只关注占用内存空间的大小,不关注内存中存放什么数据;strlen关注内存中是否有 \0 ,如果没有 \0 ,就会继续往后找,有可能会越界。
注意: 在文章中已经介绍了sizeof和strlen的区别和使用方法,需要我们特别注意的是:srtlen只有在遇到'\0'时,才会结束,就是只计算'\0'之前的字符,所以我们在使用时一定要记得加上'\0';在使用sizeof时,我们必须要记住,数组名是首元素地址,有两个除外——
1、sizeof(数组名),计算的是整个数组的大小,单位是字节(8个bit);
2、&数组名,表示的是整个数组的地址——如果不加&,光数组名是数组的首元素地址,它们之间的不同点就是跨度不一样。
这就是本篇的全部内容了,本文主要介绍了sizeof计算数组元素个数、strlen函数相关的一些知识点以及两者的区别,如果友友们有什么想法,可以在评论区交流一下。