鱼C论坛

 找回密码
 立即注册
查看: 613|回复: 4

求解答问题

[复制链接]
发表于 2024-4-18 16:41:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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

        length = sizeof(str) / sizeof(str[0]);

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

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

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[0]);  // 计算字符数组中字符的个数

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

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

        return 0;
}

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-18 16:46:14 | 显示全部楼层
本帖最后由 isdkz 于 2024-4-18 16:52 编辑

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

小球的数量(length)= 小球的总重量sizeof(str) / 单个小球的重量 sizeof(str[0]);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-18 16:50:09 | 显示全部楼层
可以用求平均值的方法理解。
str[] 就是一个数列,里面有几个值且都相等 (字符占用的字节数是恒定的),
sizeof(str) 求得就是该数列的和,而 sizeof(str[0]) 求的是数列中一个值的大小。
用总数除以单个值,得出的就是长度。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[0]) 得到的是数组 str 每个元素占用的字节数 1,用 sizeof(str) / sizeof(str[0]) 得到的是 str 可容纳 char 型元素的最大数量,在 Windows 和 Linux 系统上,表达式
sizeof(str) / sizeof(str[0])
        的数值将分别为 3 和 4。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 01:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表