2220201979 发表于 2022-9-9 18:06:07

课后题-指针与数组动动手0-进阶要求

本帖最后由 2220201979 于 2022-9-9 20:00 编辑

用以下代码做个实验:
#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 个字节的存储空间,并且都是负数。以此规律,我们只要检测一个字符对应的整型值是否为负数,如果是(中文字符),则将指针往后移动两个字节。
按照答案的说法,不应该把指针往后移动四个字节么

临时号 发表于 2022-9-9 18:09:51

linux使用utf-8编码,中文占3个字节,再加上'\0'就是4个字节
windows使用gbk编码,中文占2个字节,再加上'\0'就是3个字节

人造人 发表于 2022-9-9 18:10:17

课后题写错了,输出4说明一个中文字符占3个字节
输出3说明一个中文字符占2个字节

2220201979 发表于 2022-9-9 18:13:14

人造人 发表于 2022-9-9 18:10
课后题写错了,输出4说明一个中文字符占3个字节
输出3说明一个中文字符占2个字节

那指针为什么要往后移2个字节而不是三个字节呢?

2220201979 发表于 2022-9-9 18:14:50

临时号 发表于 2022-9-9 18:09
linux使用utf-8编码,中文占3个字节,再加上'\0'就是4个字节
windows使用gbk编码,中文占2个字节,再加上'\0' ...

那指针不应该向后移动3个字节么,为什么答案是两个字节

人造人 发表于 2022-9-9 18:20:04

2220201979 发表于 2022-9-9 18:13
那指针为什么要往后移2个字节而不是三个字节呢?

什么?

2220201979 发表于 2022-9-9 19:38:12

人造人 发表于 2022-9-9 18:20
什么?

不难发现,每个中文字符在我们的系统中是占用 4 个字节的存储空间,并且都是负数。以此规律,我们只要检测一个字符对应的整型值是否为负数,如果是(中文字符),则将指针往后移动两个字节。
第一张图片上面还有一行字

人造人 发表于 2022-9-9 19:47:59

2220201979 发表于 2022-9-9 19:38
第一张图片上面还有一行字

这代码里面哪有什么指针后移两个字节?

2220201979 发表于 2022-9-9 19:58:23

人造人 发表于 2022-9-9 19:47
这代码里面哪有什么指针后移两个字节?

请自行观察你当前系统对中文字符的处理方式,并设计一个可以统计中文字符以及中英文混合字符的程序。
#include <stdio.h>

#define MAX 1024

int main()
{
      char str;
      char *target = str;
      char ch;
      int length = 0;

      printf("请输入一个字符串:");
      fgets(str, MAX, stdin);

      while (1)
      {
                ch = *target++;
                if (ch == '\0')
                {
                        break;
                }
                if ((int)ch < 0)
                {
                        target += 2;这里加二
                }
                length++;
      }

      printf("您总共输入了 %d 个字符!\n", length - 1);

      return 0;
}这个题的完整代码是这样的,之前的那个是小甲鱼做的一个实验
可以参考链接https://fishc.com.cn/forum.php?mod=viewthread&tid=72205&extra=page%3D1%26filter%3Dtypeid%26typeid%3D570

人造人 发表于 2022-9-9 20:03:08

2220201979 发表于 2022-9-9 19:58
请自行观察你当前系统对中文字符的处理方式,并设计一个可以统计中文字符以及中英文混合字符的程序。
这 ...

target是加了2
但是17行还加了1,17行加的1次就不算了?

人造人 发表于 2022-9-9 20:03:53

2220201979 发表于 2022-9-9 19:58
请自行观察你当前系统对中文字符的处理方式,并设计一个可以统计中文字符以及中英文混合字符的程序。
这 ...

17行加了1次
24行加了2次
一共是3次

临时号 发表于 2022-9-9 20:07:48

2220201979 发表于 2022-9-9 19:58
请自行观察你当前系统对中文字符的处理方式,并设计一个可以统计中文字符以及中英文混合字符的程序。
这 ...

你的这代码只能在使用了utf-8的机器上才能运行
页: [1]
查看完整版本: 课后题-指针与数组动动手0-进阶要求