单目操作符sizeof和库函数strlen()求字符串长度的区别及字符串结束标志‘\0‘的重要性

文章详细介绍了C语言中单目操作符sizeof和库函数strlen()在计算字符串长度时的不同之处。sizeof返回的是数组或类型所占的字节数,而strlen()计算的是字符串中字符的数量,直到遇到结束标志为止。对于未明确指定结束标志的字符数组,strlen()可能会导致不确定的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先举例说明单目操作符sizeof的用法:

//sizeof用来求操作数的类型长度(以字节为单位)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
    int arr[] = { 1,2,3 };
    printf("%d\n", sizeof(arr[0]));            //结果打印4
        //sizeof(arr[0])是求数组arr中下标为0的元素的类型长度,而数组arr是int型数组,数组中的所有元素即为int型,int类型的大小为4个字节

    printf("%d\n", sizeof(arr));            //结果打印12
        //sizeof(arr)是求整个数组arr的类型长度,数组中一共有3个元素,每个元素都是int类型,而int型大小为4个字节,3*4=12个字节
    return 0;
}

单目操作符sizeof和库函数strlen()求字符串长度的区别

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>        //调用库函数strlen()所需要的头文件
int main()
{
    char arr1[] = "abcdef";
    char arr2[] = { 'a','b','c','d','e','f' };
    char arr3[] = { 'a','b','c','d','e','f','\0' };
    printf("%s\n", arr1);            //abcdef
    printf("%s\n", arr2);            //abcdef烫烫烫烫烫烫
    printf("%s\n", arr3);            //abcdef
        //从打印结果我们能清晰的看出对于字符串来讲,arr1和arr3的写法等价,原因在于:
            //"abcdef"在我们能看得到的最后一个字符'f'的后边隐藏了一个字符'\0',它是字符串的结束标志,但不计入字符串的内容
            //{ 'a','b','c','d','e','f','\0' }这种大括号的形式,是把字符串中包含的所有元素都清晰地展现出来,'\0'也是字符串的元素之一
            //{ 'a','b','c','d','e','f' }它的打印结果在最后一个元素后面出现乱码现象,是因为字符串的打印只有在遇到字符串结束标志'\0'才会停止打印,否则就会一直打印,出现乱码

        
    printf("%d\n", sizeof(arr1) / sizeof(arr1[0]));        //结果打印7
    printf("%d\n", strlen(arr1));                                //结果打印6
        //对于arr1的两种计算方式求得的结果不同,问题出在字符'\0'上面,'\0'属于字符串"abcdef"的一个元素,而在strlrn()计算字符串长度时'\0'只是字符串结束标志并不计入字符串的内容,但是sizeof(arr1) / sizeof(arr1[0])计算的是字符串所包含的元素个数,'\0'也是字符串的一个元素

    printf("%d\n", sizeof(arr2) / sizeof(arr2[0]));        //结果打印6
    printf("%d\n", strlen(arr2));                                //结果打印22
        //对于arr2的两种计算方式求得的结果不同,是因为arr2中没有字符'\0',
        //sizeof(arr2) / sizeof(arr2[0])求得结果是6,就是单纯的表示arr2有6个元素,但是strlen(arr2)求得结果是22,其实并不是一成不变,它也有可能是大于6的任何一个值,具体结果会是几取决于strlen()在统计字符串时候什么时候遇到'\0',strlen()只有在遇到'\0'之后才会终止计算,arr2中没有包含'\0',所以才会使得strlen()求得的最终结果是个随机值

    printf("%d\n", sizeof(arr3) / sizeof(arr3[0]));        //结果打印7
    printf("%d\n", strlen(arr3));                                //结果打印6
        //对于arr3的两种计算方式求得的结果不同,原因与arr1相同,因为arr1和arr3等价

    return 0;
}

//总结:
//1.在字符串中,'\0'是字符串结束标志,属于字符串的元素之一,但是不计入字符串的内容,
//2.sizeof(arr) / sizeof(arr[0])这种计算方法计算的是arr中的元素个数,strlen()计算的是字符串的内容有几个字符,
//3.sizeof是一个操作符,它属于单目操作符,而strlen()是一个库函数,调用strlen()需要包含头文件<string.h>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值