一,sisizeof()与strlen()的函数介绍
strlen函数:
strlen函数用于获取字符串的实际长度,即字符串中的字符个数(不包括字符串末尾的空字符'\0'),通过遍历来实现的。
sizeof运算符:
sizeof运算符用于获取数据类型或变量所占用的字节数。sizeof运算符在编译时就会被计算出来,它并不是一个真正的函数或运算符,而是一个编译器内部的操作符。sizeof运算符的实现原理可以简单描述为以下几个步骤:
-
编译器在编译过程中,会根据变量的类型或表达式的类型来确定其占用的字节数。
-
对于基本数据类型(如int、char等),编译器会根据类型的规范来确定其字节数。
-
对于结构体或联合体类型,编译器会计算其成员变量的总字节数,并考虑对齐方式。
-
对于数组类型,编译器会计算整个数组占用的字节数,即数组的长度乘以单个元素的字节数。
-
编译器在编译过程中,会将sizeof运算符替换为对应的字节数。
需要注意的是,sizeof运算符在编译时就会被计算出来,它不会对运行时的数据进行任何计算。因此,sizeof运算符的结果是在编译时确定的,对于不同的编译器和平台,可能会有所差异。
二,来看看它们对同一个数组的计算结果
例1:
#include <stdio.h>
#include <string.h>
int main() {
char str[20] = "Hello";
int size = sizeof(str); // 字符数组的大小,包括结束符'\0'
int len = strlen(str); // 字符串的长度,不包括结束符'\0'
printf("sizeof的计算值: %d\n", size);
printf("strlen的计算值: %d\n", len);
return 0;
}
结果:
sizeof的计算值: 20
strlen的计算值: 5
分析:
在这个例子中,我们定义了一个大小为20的字符数组str
,并初始化为字符串"Hello"。由于字符数组的大小为20,char类型为一个字节大小,所以使用sizeof
运算符获取到的大小是20,包括了字符串"Hello"以及剩余的空间。而使用strlen
运算符获取到的长度是5,因为它只计算字符串中字符的个数,不包括结束符\0
。
例2:
我们再看看这个例子
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello";
int size = sizeof(str); // 字符数组的大小,包括结束符'\0'
int len = strlen(str); // 字符串的长度,不包括结束符'\0'
printf("sizeof的计算值: %d\n", size);
printf("strlenof的计算值: %d\n", len);
return 0;
}
结果:
sizeof的计算值: 6
strlenof的计算值: 5
分析:
可以看到,字符数组str
包含了字符串"Hello"以及一个结束符\0
。所以使用sizeof
运算符获取到的大小是6,而使用strlen
运算符获取到的长度是5,不包括结束符\0
三,如何使用sizeof()来获得 strlen()的效果
1.非字符串及无 '/0'结尾的字符串
#include <stdio.h>
#include <string.h>
int main() {
int str[] = {1,2,3,4,5};
printf("sizeof的计算值: %d\n",sizeof(str)/sizeof(int));
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main()
{
char str[5]="12345";
printf("sizeof的计算结果:%d",sizeof(str)/sizeof(char));
return 0;
}
结果:
sizeof的计算值: 5
2. 带 '/0'的字符串
#include <stdio.h>
#include <stdlib.h>
int main()
{
char str[]="12345";
printf("sizeof的计算结果:%d",sizeof(str)/sizeof(char)-1);
return 0;
}
结果:
sizeof的计算值: 5