关于c中的sizeof()与strlen()的区别

一,sisizeof()与strlen()的函数介绍

strlen函数:

strlen函数用于获取字符串的实际长度,即字符串中的字符个数(不包括字符串末尾的空字符'\0'),通过遍历来实现的。

sizeof运算符:

sizeof运算符用于获取数据类型或变量所占用的字节数。sizeof运算符在编译时就会被计算出来,它并不是一个真正的函数或运算符,而是一个编译器内部的操作符。sizeof运算符的实现原理可以简单描述为以下几个步骤:

  1. 编译器在编译过程中,会根据变量的类型或表达式的类型来确定其占用的字节数。

  2. 对于基本数据类型(如int、char等),编译器会根据类型的规范来确定其字节数。

  3. 对于结构体或联合体类型,编译器会计算其成员变量的总字节数,并考虑对齐方式。

  4. 对于数组类型,编译器会计算整个数组占用的字节数,即数组的长度乘以单个元素的字节数。

  5. 编译器在编译过程中,会将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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值