大学里的小菜鸡 发表于 2020-8-22 19:54:32

c语言课后作业22,指针与数组

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

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



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


运行小甲鱼的代码我这显示的不符合啊

sunrise085 发表于 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);

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

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

    return 0;
}

运行结果
length of str: 7
str = -28
str = -72
str = -83
str = -27
str = -101
str = -67
str = 0

风过无痕1989 发表于 2020-8-22 20:49:54

sizeof是运算操作符,得到的结果类型为size_t,即unsigned int类型。

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

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

大学里的小菜鸡 发表于 2020-8-22 20:54:54

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

length = sizeof(str) / sizeof(str);
这行代码就是为了活动字节长度吗?如果是的话为什么是除不是减呢

大学里的小菜鸡 发表于 2020-8-22 21:03:39

风过无痕1989 发表于 2020-8-22 20:49
sizeof是运算操作符,得到的结果类型为size_t,即unsigned int类型。

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


strlen返回的值不是应该比sizeof的值小一吗,strlen没有计算最后的\0;我记得小甲鱼说sizeof计算的是尺寸,strlen计算的是长度

sunrise085 发表于 2020-8-22 21:05:55

大学里的小菜鸡 发表于 2020-8-22 20:54
length = sizeof(str) / sizeof(str);
这行代码就是为了活动字节长度吗?如果是的话为什么是除不是减 ...

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

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

    return 0;
}

sunrise085 发表于 2020-8-22 21:07:08

风过无痕1989 发表于 2020-8-22 20:49
sizeof是运算操作符,得到的结果类型为size_t,即unsigned int类型。

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


你这个是编码不同。
和楼主用的不是同样的编译器

风过无痕1989 发表于 2020-8-22 21:24:35

sunrise085 发表于 2020-8-22 21:07
你这个是编码不同。
和楼主用的不是同样的编译器

是,我用的是VC++6.0

风过无痕1989 发表于 2020-8-22 21:27:20

修改了一下程序:

#include <stdio.h>

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

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

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

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

      return 0;
}

大学里的小菜鸡 发表于 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吗,现在解决了,打扰了

sunrise085 发表于 2020-8-24 17:55:27

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

你选的 这个最佳答案是解决你的问题的吗?
用的编译器都不一样,编码方式也不同。
为啥我这么认真的解答问题,都不换不来一个最佳答案呢。。。

大学里的小菜鸡 发表于 2020-8-24 18:06:03

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

不是,您的回答对我的帮助很大,很感谢,但是我本人比较喜欢图片点,感觉这样形象一点,很抱歉,但是您的回答对我的确有很大的帮助

sunrise085 发表于 2020-8-24 18:38:20

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

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

你这因为你个人喜好,就不顾回答问题者的利益了?

大学里的小菜鸡 发表于 2020-8-24 18:51:25

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

现在知道规则了,下次一定改正
页: [1]
查看完整版本: c语言课后作业22,指针与数组