鱼C论坛

 找回密码
 立即注册
查看: 1688|回复: 13

[已解决]c语言课后作业22,指针与数组

[复制链接]
发表于 2020-8-22 19:54:32 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 大学里的小菜鸡 于 2020-8-22 20:14 编辑

#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;
}
复制代码


113637ihmcp88m1h1491y8[1].png
不难发现,每个中文字符在我们的系统中是占用 4 个字节的存储空间,并且都是负数。以此规律,我们只要检测一个字符对应的整型值是否为负数,如果是(中文字符),则将指针往后移动两个字节。
请问不是占用四个字节吗,为什么是后移两个字节,为什么不是移动其它个数的字节,我电脑运行这代码显示的是3,那该移动多少字节
X8X)@BOK1F%P1HMAK]2@4(T.png

运行小甲鱼的代码我这显示的不符合啊
最佳答案
2020-8-22 20:12:30
本帖最后由 sunrise085 于 2020-8-22 20:13 编辑

你理解的不对,一个汉字占三个字节,另外一个是字符串的结束字符'\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;
}

运行结果
length of str: 7
str[0] = -28
str[1] = -72
str[2] = -83
str[3] = -27
str[4] = -101
str[5] = -67
str[6] = 0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-22 20:12:30 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sunrise085 于 2020-8-22 20:13 编辑

你理解的不对,一个汉字占三个字节,另外一个是字符串的结束字符'\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;
}

运行结果
length of str: 7
str[0] = -28
str[1] = -72
str[2] = -83
str[3] = -27
str[4] = -101
str[5] = -67
str[6] = 0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-8-22 20:49:54 | 显示全部楼层
sizeof是运算操作符,得到的结果类型为size_t,即unsigned int类型。

利用sizeof()计算数组的长度
数组的长度 = 数组所占的大小/单个数组元素所占的大小

运行结果也证明这一点,单个中文字符的长度是2,两个中文字符的长度是4,四个中文字符的长度是8。下图分另显示的是3,5,9,这是因为用sizeof计算字符长度,包括字符串结尾的'\0',用strlen返回的是该字符串的长度,包括字符串结尾的'\0'。

zwzf.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-22 20:54:54 | 显示全部楼层
sunrise085 发表于 2020-8-22 20:12
你理解的不对,一个汉字占三个字节,另外一个是字符串的结束字符'\0'
你可以多输入几个汉字,就知道一个汉 ...

length = sizeof(str) / sizeof(str[0]);
这行代码就是为了活动字节长度吗?如果是的话为什么是除不是减呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-22 21:03:39 | 显示全部楼层
风过无痕1989 发表于 2020-8-22 20:49
sizeof是运算操作符,得到的结果类型为size_t,即unsigned int类型。

利用sizeof()计算数组的长度

strlen返回的值不是应该比sizeof的值小一吗,strlen没有计算最后的\0;我记得小甲鱼说sizeof计算的是尺寸,strlen计算的是长度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-22 21:05:55 | 显示全部楼层
大学里的小菜鸡 发表于 2020-8-22 20:54
length = sizeof(str) / sizeof(str[0]);
这行代码就是为了活动字节长度吗?如果是的话为什么是除不是减 ...

这个代码是为了获得字符串数组的字符数,用字符串的字节数除以一个单元的字节数
用char看不出来什么效果,若用其他类型就看出效果了
#include<stdio.h>

int main()
{
    int str[] = {12,2,5};
    printf("数组的字节数:%lu,一个单元的字节数:%lu\n",sizeof(str),sizeof(str[0]));
    printf("数组的长度:%lu\n",sizeof(str)/sizeof(str[0]));

    return 0;
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-22 21:07:08 | 显示全部楼层
风过无痕1989 发表于 2020-8-22 20:49
sizeof是运算操作符,得到的结果类型为size_t,即unsigned int类型。

利用sizeof()计算数组的长度


你这个是编码不同。
和楼主用的不是同样的编译器
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-22 21:24:35 | 显示全部楼层
sunrise085 发表于 2020-8-22 21:07
你这个是编码不同。
和楼主用的不是同样的编译器

是,我用的是VC++6.0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-22 21:27:20 | 显示全部楼层
修改了一下程序:
#include <stdio.h>

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

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

        printf("length of str: %d\n", length - 1);    // 长度减 1,去掉结尾标志

        for (i = 0; i < length - 1; i++)
        {
                printf("str[%d] = %d\n", i, str[i]);  // str 输出的是地址,改为 str[i]
        }

        return 0;
}

zwzf2.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-24 12:25:12 | 显示全部楼层
本帖最后由 大学里的小菜鸡 于 2020-8-24 12:31 编辑
sunrise085 发表于 2020-8-22 21:05
这个代码是为了获得字符串数组的字符数,用字符串的字节数除以一个单元的字节数
用char看不出来什么效果 ...


你好,请教一个virtualbox安装过程中在安装图形界面过程中的切换普通用户输入reboot,却没有重启,而是显示need to be root,请问这是需要切换到root超级权限后再输入reboot吗,现在解决了,打扰了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-24 17:55:27 | 显示全部楼层
大学里的小菜鸡 发表于 2020-8-24 12:25
你好,请教一个virtualbox安装过程中在安装图形界面过程中的切换普通用户输入reboot,却没有重启,而是 ...

你选的 这个最佳答案是解决你的问题的吗?
用的编译器都不一样,编码方式也不同。
为啥我这么认真的解答问题,都不换不来一个最佳答案呢。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-24 18:06:03 | 显示全部楼层
sunrise085 发表于 2020-8-24 17:55
你选的 这个最佳答案是解决你的问题的吗?
用的编译器都不一样,编码方式也不同。
为啥我这么认真的解 ...

不是,您的回答对我的帮助很大,很感谢,但是我本人比较喜欢图片点,感觉这样形象一点,很抱歉,但是您的回答对我的确有很大的帮助
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-24 18:38:20 | 显示全部楼层
大学里的小菜鸡 发表于 2020-8-24 18:06
不是,您的回答对我的帮助很大,很感谢,但是我本人比较喜欢图片点,感觉这样形象一点,很抱歉,但是您的 ...

论坛的评选最佳答案的机制。
第一、帮助提问者解答问题;
第二、帮助后面遇到同样问题的人快速找解决方法;
第三、给解答问题者奖励。

你这因为你个人喜好,就不顾回答问题者的利益了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-24 18:51:25 | 显示全部楼层
sunrise085 发表于 2020-8-24 18:38
论坛的评选最佳答案的机制。
第一、帮助提问者解答问题;
第二、帮助后面遇到同样问题的人快速找解决方 ...

现在知道规则了,下次一定改正
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-13 07:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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