初识C语言—— strlen 与 sizeof

本文详细解释了C语言中的strlen函数,专门用于计算字符串长度,以及sizeof运算符,用于获取变量、数据类型和数组占用的内存空间大小。两者在使用场景和计算规则上有所差异,有助于理解C语言内存管理的基础概念。
摘要由CSDN通过智能技术生成

        在《初识 C 语言——数组》篇中的二分查找的例子中,计算数组元素个数时使用的是 sizeof 操作符。不知道各位友友是否有这样的疑惑:sizeof 和 strlen 两者都能够计算元素长度,那它们到底有啥区别呢?其实,在我学习 C 语言的过程中曾有段时间一直将这两者混淆,但好在我善于钻研、勤于耕耘、刨根问底(一个巴掌拍过来,并鄙视滴说这银真不要脸),终于!!!,把这个问题搞清楚了。下面,我将详细介绍这两位虎子(学习编程路上遇到的所有问题都会被溜肉段er 亲切滴称之为虎子)。

一号虎子:strlen

  • strlen 是 C 语言中的一个函数,用于计算字符串的长度,即字符串中的字符数;
  • strlen 函数的操作数只能是 char 类型,且必须是以 '\0'结尾的字符串。换句话说,strlen 函数会在遇到第一个 '\0' 字符(字符串结束符)时停止计数,因此它返回的长度不包括 '\0';
  • strlen 函数只能在运行时才能计算;
  • 该函数由 C 语言标准库提供,所以在使用 strlen 时,需要在程序中添加头文件,例如:#include <string.h>。

        只对知识进行文字描述无疑是苍白的,于是,本驯虎师会在本文中引入几个例子来对所述文字进行具象化说明。

例 1 :

#include <stdio.h>
#include <string.h>

int main()
{
    char str[] = "Hello" ;
    char arr[] = {'H','e','l','l','o'};
 
    printf("%d\n", strlen(str));
    printf("%d\n", strlen(arr));
    return 0;
}

运行结果为:

        通过观察例 1 的运行结果,有没有小伙伴们发现端倪呢?哎?同样是打印 hello 的长度,为什么 一个为 5,一个为 33 呢?

        在这里,我们就要重温一下 strlen 的获取规则了,即:从前往后依次检测,直到遇到 '\0' 时就终止检测。在 str[ ] 字符数组中放的是一个字符串(字符串自身就自带 '\0' ),所以 strlen 在'\0' 前面共检测到 5 个字符。而 arr[ ] 是一个字符数组,不是一个有效的字符串,因为后面没有放置 '\0',因此 strlen 在求解时,将有效字符检测完之后,还会继续向后检测,直到遇到 '\0' 时才终止,因此答案为随机值,就看紧跟在 'o' 之后的第一个 '\0' 在什么位置。

二号虎子:sizeof

  • sizeof 是 C 语言中的一个单目运算符,可以用来计算操作数的存储空间大小,单位为字节。
  • 操作数可以是变量、函数、数据类型、表达式等。当 sizeof 的操作数是表达式时,可以省略后边的括号,且表达式不真实参与运算,只根据表达式的类型来得出大小;
  • sizeof 是在编译时计算的,并且返回的是操作数的所占内存空间大小;
  • sizeof 的计算结果是 size_t 类型的,是 C 语言自定义的一个类型,用来统一表示 sizeof 的返回值类型;
  • 在处理含有 '\0' 的字符串时,sizeof 运算符计算的长度包括了整个字符数组,包括 '\0' 字符。

例 2 :计算数据类型长度

#include <stdio.h>

int main()
{
    printf("%zd\n",sizeof(char));
    printf("%zd\n",sizeof(_Bool));
    printf("%zd\n",sizeof(short));
    printf("%zd\n",sizeof(int));
    printf("%zd\n",sizeof(long));
    printf("%zd\n",sizeof(long long));
    printf("%zd\n",sizeof(float));
    printf("%zd\n",sizeof(double));
    printf("%zd\n",sizeof(long double));
    

    return 0;
}

运行结果为:   

        由例 2 可知,不同的数据类型,其长度也不尽相同。此外,在 C 语言中 %zd 通常用于输出size_t 类型的变量。

例 3 :

#include <stdio.h>

int main()
{
    int a = 8;
    printf("%zd\n",sizeof(a));
    printf("%zd\n",sizeof a);//a是变量的名字,可以省略sizeof后边的()
    printf("%zd\n",sizeof(int));
    printf("%zd\n",sizeof(3+3.5));

    return 0;
}

运行结果如下:

        因为变量 a 属于 int 类型,而由例 2 可知,int 类型变量的长度为 4,故执行完例 3 中的前三个 printf 语句的打印结果为 4。下面,我们继续看第四个printf 语句,由上述文字说明中可知,sizeof 后的表达式不参与真实计算,而只是根据类型得出大小。所以,3 的数据类型为 int ,3.5 的数据类型为 float,而它们的数据长度均为 4,故两者之和为 8 。

例 4 :计算数组元素个数

#include <stdio.h>

int main()
{
    int arr[10] = {0};
    int sz = sizeof(arr) / sizeof(arr[0]);
    printf("%d\n",sz);
    return 0;
}

        在该例中,sizeof 可以计算数组大小,即:首先 sizeof (arr) 计算数组所占内存空间的总大小,我们又知道数组中所有元素的类型都是相同的,那就只要计算一个元素所占字节的个数,数组的元素个数就能算出来,这里我们选择第一个元素算大小就可以;接下来就可以计算出数组的元素个数。

        这样做的作用:以后在代码中需要数组元素个数的地方不用固定写死了,使用上述的计算,不管数组怎么变化,计算出的大小也就随着变化了。

驯虎师总结

        strlen 函数只能用于计算 char 类型,且必须是以 '\0' 结尾的字符串。而 sizeof 可以计算变量、数据类型、函数等操作数的所占内存空间大小,单位为字节;对于数组,sizeof 返回整个数组的大小,包含数组中的所有元素和结尾 '\0' (如果有的话)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值