鱼C论坛

 找回密码
 立即注册
查看: 2260|回复: 10

[已解决]如果字符数组里面的值是中文怎么处理?

[复制链接]
发表于 2022-4-30 15:48:40 | 显示全部楼层 |阅读模式

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

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

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

我没懂,中文在c语言中对应的整形值是负的,但是检测到负数以后把指针往后移动两位有什么用?
详见第24行的程序
  1. #include <stdio.h>

  2. #define MAX 1024

  3. int main()
  4. {
  5.         char str[MAX];
  6.         char *target = str;
  7.         char ch;
  8.         int length = 0;

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

  11.         while (1)
  12.         {
  13.                 ch = *target++;
  14.                 if (ch == '\0')
  15.                 {
  16.                         break;
  17.                 }
  18.                 if ((int)ch < 0)
  19.                 {
  20.                         target += 2;//如果是中文指针+2
  21.                 }
  22.                 length++;
  23.         }

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

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

  1. ch = *target++;
复制代码

这句等同
  1. ch = *target;
  2. target = target + 1;
复制代码

也就是每一步开始就向后移动了1字节,又因为汉字占3字节,如果读到的ch是汉字,那么后面3字节空间都属于这个汉字的
想要跳过这个汉字继续读下一个字符,就应该向后移动3字节,开始已经后移了1字节,故还需要再后移2字节。
uTools_1651311285532.png
uTools_1651311332331.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-4-30 16:29:04 | 显示全部楼层
问题和图片有什么关联吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-30 17:36:40 | 显示全部楼层
风车呼呼呼 发表于 2022-4-30 16:29
问题和图片有什么关联吗

不好意思,弄错图片了,我已经修改过来了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-30 17:37:22 | 显示全部楼层
图一是题目要求,图二是小甲鱼给的解释

这是图2所涉及到的程序
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         char str[] = "中";
  5.         int length, i;

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

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

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

  12.         return 0;
  13. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-30 17:52:39 | 显示全部楼层    本楼为最佳答案   
因为不同的编码格式中,汉字所占字节数会有所不同。所以先通过图上代码测试出实验环境中的汉字所占字节数。
图上说每个汉字占4字节应该具有一定歧义,单个汉字存储的话确实是占4字节(因为包含了\0),如果是连续的汉字字符串比如“你好”,所占的字节数是7个字节(每个汉字占3字节+最后的\0结束符)

  1. ch = *target++;
复制代码

这句等同
  1. ch = *target;
  2. target = target + 1;
复制代码

也就是每一步开始就向后移动了1字节,又因为汉字占3字节,如果读到的ch是汉字,那么后面3字节空间都属于这个汉字的
想要跳过这个汉字继续读下一个字符,就应该向后移动3字节,开始已经后移了1字节,故还需要再后移2字节。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-30 18:12:26 From FishC Mobile | 显示全部楼层
     LINUX 操作系统字符采用 utf-8 编码,每个西文字符占用 1 个字节,中文字符占用 3 个字节,在 WINDOWS 系统上,字符采用 gbk 编码,每个西文字符任然占用 1 个字节,但是,每个中文字符占用的是 2 个字节,楼主的代码只能适合在 LINUX 系统下使用,如果要在 WINDOWS 系统下,这个代码是需要修改的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-5-1 13:06:16 | 显示全部楼层
风车呼呼呼 发表于 2022-4-30 17:52
因为不同的编码格式中,汉字所占字节数会有所不同。所以先通过图上代码测试出实验环境中的汉字所占字节数。 ...

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

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

  1. #include <stdio.h>

  2. #define MAX 1024

  3. int main()
  4. {
  5.         char str[MAX];
  6.         char *target = str;
  7.         int length = 0;

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

  10.         while (*target++ != '\0')
  11.         {
  12.                 length++;
  13.         }

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

  15.         return 0;
  16. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

有时候可以有时候不行,有点奇怪,比如如果加上了逗号就不行了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-1 16:38:32 | 显示全部楼层
1613551 发表于 2022-5-1 15:45
有时候可以有时候不行,有点奇怪,比如如果加上了逗号就不行了

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

使用道具 举报

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

好的,我知道了大佬
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-24 10:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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