C语言关于strlen和sizeof的区别以及使用注意事项

在 C 语言中,数组和字符串有以下一些区别:

一、定义和存储方式

  • 数组
    • 是一组相同数据类型元素的集合,可以存储任何数据类型,如整数、字符、结构体等。
    • 例如 int arr[5] = {1, 2, 3, 4, 5} 定义了一个包含 5 个整数的数组。
    • 数组在定义时必须指定大小,且这个大小在编译时就确定了,不能动态改变。
  • 字符串
    • 在 C 语言中,字符串实际上是以空字符 '\0' 结尾的字符数组。
    • 例如 char str[] = "Hello",这里存储了字符 'H''e''l''l''o' 和一个空字符 '\0'

二、操作方式

  • 数组
    • 可以通过下标访问和修改其中的任意元素。例如 arr[2] = 10 可以将数组 arr 的第三个元素修改为 10。
    • 可以进行一些常见的数组操作,如遍历、排序、查找等,但这些操作通常需要手动实现。
  • 字符串
    • 有一些专门用于字符串处理的库函数,如 strcpy(复制字符串)、strcat(连接字符串)、strcmp(比较字符串)等。
    • 字符串的操作通常更侧重于文本处理,比如拼接、比较、查找子串等。

三、长度确定

  • 数组
    • 数组的长度在定义时确定,并且可以通过 sizeof(arr) / sizeof(arr[0]) 来计算其长度。
    • 如果数组的元素个数发生变化,通常需要重新定义一个新的数组。
  • 字符串
    • 字符串的长度可以通过 strlen 函数来计算,该函数从字符串的首地址开始遍历,直到遇到空字符 '\0' 为止,返回的长度不包括空字符。
    • 字符串的长度可以动态变化,例如通过连接操作可以使字符串变长。

四、初始化方式

  • 数组
    • 可以在定义时初始化所有元素,也可以在定义后逐个元素进行初始化。
    • 例如 int arr[3] = {1, 2, 3} 或者 arr[0] = 4; arr[1] = 5; arr[2] = 6;
  • 字符串
    • 可以使用字符串字面量进行初始化,如 char str[] = "Hello"
    • 也可以逐个字符进行初始化,但必须确保最后一个字符是 '\0',以表示字符串的结束。

以下是试例

我们可以发现a11的值也就是arr1数组用strlen计算出的值与我们其他计算的值有很大的差异

出现这个问题是因为 strlen 函数在计算字符串长度时,是从给定的地址开始一直向后计数,直到遇到第一个 '\0'(空字符)为止。

在代码中,虽然初始化了 char arr1[] = {'A', 'B', 'C'};,但是这个数组并不是以空字符结尾的字符串,所以 strlen 函数会继续向后查找空字符,直到它在内存中的某个位置遇到了一个值为 0 的字节(这可能是在你的程序的其他部分的内存中),在此过程中它可能会遍历很多内存位置,导致输出一个不确定的值。

如果想要正确使用 strlen,应该确保数组以空字符结尾,例如 char arr[4] = {'A', 'B', 'C','\0'};。这样 strlen(arr) 就会正确地输出 3。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值