1613551 发表于 2022-4-30 15:48:40

如果字符数组里面的值是中文怎么处理?

本帖最后由 1613551 于 2022-4-30 17:36 编辑

我没懂,中文在c语言中对应的整形值是负的,但是检测到负数以后把指针往后移动两位有什么用?
详见第24行的程序
#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;//如果是中文指针+2
                }
                length++;
      }

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

      return 0;
}

风车呼呼呼 发表于 2022-4-30 16:29:04

问题和图片有什么关联吗

1613551 发表于 2022-4-30 17:36:40

风车呼呼呼 发表于 2022-4-30 16:29
问题和图片有什么关联吗

不好意思,弄错图片了,我已经修改过来了

1613551 发表于 2022-4-30 17:37:22

图一是题目要求,图二是小甲鱼给的解释

这是图2所涉及到的程序
#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;
}

风车呼呼呼 发表于 2022-4-30 17:52:39

因为不同的编码格式中,汉字所占字节数会有所不同。所以先通过图上代码测试出实验环境中的汉字所占字节数。
图上说每个汉字占4字节应该具有一定歧义,单个汉字存储的话确实是占4字节(因为包含了\0),如果是连续的汉字字符串比如“你好”,所占的字节数是7个字节(每个汉字占3字节+最后的\0结束符)

ch = *target++;
这句等同
ch = *target;
target = target + 1;
也就是每一步开始就向后移动了1字节,又因为汉字占3字节,如果读到的ch是汉字,那么后面3字节空间都属于这个汉字的
想要跳过这个汉字继续读下一个字符,就应该向后移动3字节,开始已经后移了1字节,故还需要再后移2字节。

jackz007 发表于 2022-4-30 18:12:26

   LINUX 操作系统字符采用 utf-8 编码,每个西文字符占用 1 个字节,中文字符占用 3 个字节,在 WINDOWS 系统上,字符采用 gbk 编码,每个西文字符任然占用 1 个字节,但是,每个中文字符占用的是 2 个字节,楼主的代码只能适合在 LINUX 系统下使用,如果要在 WINDOWS 系统下,这个代码是需要修改的。

1613551 发表于 2022-5-1 13:06:16

风车呼呼呼 发表于 2022-4-30 17:52
因为不同的编码格式中,汉字所占字节数会有所不同。所以先通过图上代码测试出实验环境中的汉字所占字节数。 ...

懂了,可是我发现小甲鱼这个代码实现不了这个功能,不知道是不是我编译器的问题,但是我编译器上,一个中文确实是占三个字节和一个\0,两个中文就是占了7个字节,但是我实现不了小甲鱼的那个功能。

就比如我输了t中t,结果值只检测到输入了一个字符,然后我不将指针后移两位,也就不留三个位置存储中文字符,反倒可以检测到输入了3个字符,可以参考下面这个程序

#include <stdio.h>

#define MAX 1024

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

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

      while (*target++ != '\0')
      {
                length++;
      }

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

      return 0;
}

风车呼呼呼 发表于 2022-5-1 14:04:36

1613551 发表于 2022-5-1 13:06
懂了,可是我发现小甲鱼这个代码实现不了这个功能,不知道是不是我编译器的问题,但是我编译器上,一个中 ...

你这个我运行 能得到的只是字节数,不是字符数。你用的小甲鱼代码实现不了吗
有没有亲手实验一下每个汉字占多少字节?
fgets之后把str字符串打印出来确保输入没有问题,然后把每个字节的内容按%d打印出来,检查输入的汉字有多少字节,根据每个字节的内容手动走一遍自己的循环。当然如果会调试就直接调试

1613551 发表于 2022-5-1 15:45:25

风车呼呼呼 发表于 2022-5-1 14:04
你这个我运行 能得到的只是字节数,不是字符数。你用的小甲鱼代码实现不了吗
有没有亲手实验一下每个汉 ...

有时候可以有时候不行,有点奇怪,比如如果加上了逗号就不行了

风车呼呼呼 发表于 2022-5-1 16:38:32

1613551 发表于 2022-5-1 15:45
有时候可以有时候不行,有点奇怪,比如如果加上了逗号就不行了

只要不是同样的输入得到过不同的输出,那代码本身基本不会有问题。
如果是直接复制小甲鱼的代码,而且确定环境中汉字是3字节存储(UTF-8编码大部分常用汉字是3字节,但也有4字节的汉字),问题就可能出在你输入的内容上面。
你在输入内容中带上逗号,那么这个逗号是英文的还是中文的,如果是中文的,是否也和一个汉字一样占着3字节空间,每个字节强制转换整型的数字是否也是负数。能测试的方面有很多

1613551 发表于 2022-5-1 19:31:49

风车呼呼呼 发表于 2022-5-1 16:38
只要不是同样的输入得到过不同的输出,那代码本身基本不会有问题。
如果是直接复制小甲鱼的代码,而且确 ...

好的,我知道了大佬
页: [1]
查看完整版本: 如果字符数组里面的值是中文怎么处理?