故事还很长 发表于 2024-4-18 16:41:48

求解答问题

不能够理解length = sizeof(str) / sizeof(str);这个语句的意思,求长度为什么还要 除以sizeof(str),有没有大佬讲解一下,非常感谢。
#include <stdio.h>

int main()
{
      char str[] = "中";
      int length, i;

      length = sizeof(str) / sizeof(str);

      printf("length of str: %d\n", length);

      for (i = 0; i < length; i++)
      {
                printf("str[%d] = %d\n", i, str);
      }

      return 0;
}

FishC 发表于 2024-4-18 16:42:13

这个问题其实是在计算字符串的长度。你提到的代码 `length = sizeof(str) / sizeof(str);` 是一种计算字符串长度的常见方法,但是在这个例子中是错误的。

首先,让我们来解释一下为什么要使用 `sizeof(str)`。`sizeof` 是C语言中的一个操作符,用于计算给定变量、类型或表达式的大小(单位是字节)。所以 `sizeof(str)` 的结果就是变量 `str` 所占的字节数。

然而,在这个例子中,变量 `str` 的类型是 `char`,它只能存储一个字符。因此,`sizeof(str)` 的结果是1,表示 `str` 只占用了1个字节。

接下来,为什么要除以 `sizeof(str)` 呢?这是因为一个汉字字符(比如 "中")在内存中占用的字节数是多少?实际上,一个汉字字符在UTF-8编码中占用3个字节,而在UTF-16编码中占用2个字节。所以,如果我们想计算字符串的长度,需要将字符串的总字节数除以一个字符的字节数,以得到字符串中字符的个数。

但是,以上的代码存在以下几个问题:
1. `str` 定义为 `char` 类型,只能存储一个字符,无法存储整个字符串。应该使用字符串数组的方式来存储字符串。
2. 使用 `sizeof(str)` 得到的结果是1,与我们预期的字符串长度不同。因为 `sizeof()` 操作符并不会返回字符串的长度。

下面是修复后的代码:

#include <stdio.h>

int main()
{
      char str[] = "中文";// 使用字符数组来存储字符串
      int length, i;

      length = sizeof(str) / sizeof(str);// 计算字符数组中字符的个数

      printf("length of str: %d\n", length);

      for (i = 0; i < length; i++)
      {
                printf("str[%d] = %c\n", i, str);
      }

      return 0;
}

现在,通过 `sizeof(str) / sizeof(str)`,我们可以获得字符串的长度。其中 `sizeof(str)` 表示整个字符数组占用的字节数,`sizeof(str)` 表示一个字符占用的字节数。除法运算得到的结果是字符数组长度,即字符串中字符的个数。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

isdkz 发表于 2024-4-18 16:46:14

本帖最后由 isdkz 于 2024-4-18 16:52 编辑

就比如一个瓶子里放着很多同等质量的小球,

小球的数量(length)= 小球的总重量sizeof(str) / 单个小球的重量 sizeof(str);

qiuyouzhi 发表于 2024-4-18 16:50:09

可以用求平均值的方法理解。
str[] 就是一个数列,里面有几个值且都相等 (字符占用的字节数是恒定的),
sizeof(str) 求得就是该数列的和,而 sizeof(str) 求的是数列中一个值的大小。
用总数除以单个值,得出的就是长度。

jackz007 发表于 2024-4-18 18:24:04

本帖最后由 jackz007 于 2024-4-18 18:37 编辑

      char str[] = "中" ;
    1、在编译的时候,编译器会为 str 开辟足够用的存储空间,用于存放中文字符串 "中" 的汉字编码,编码的长度和编码方法密切相关。Windows 系统汉字采用了 "GBK" 编码,每个汉字编码占用 2 个字节; Linux 系统采用的是 "UTF-8" 编码,每个汉字编码占用 3 个字节。如果在这两种操作系统上编译,编译器将为 str 分别开辟 3 和 4 字节的空间,sizeof(str) 将分别等于 3 和 4。
    2、str 是 char 型的数组,存储的是 char 型的元素,我们知道,每个 char 元素占用的是 1 个字节存储空间,所以,sizeof(str) 得到的是数组 str 每个元素占用的字节数 1,用 sizeof(str) / sizeof(str) 得到的是 str 可容纳 char 型元素的最大数量,在 Windows 和 Linux 系统上,表达式
sizeof(str) / sizeof(str)
      的数值将分别为 3 和 4。
页: [1]
查看完整版本: 求解答问题