鱼C论坛

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

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

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

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

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

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

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

#define MAX 1024

int main()
{
        char str[MAX];
        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 17:52:39
因为不同的编码格式中,汉字所占字节数会有所不同。所以先通过图上代码测试出实验环境中的汉字所占字节数。
图上说每个汉字占4字节应该具有一定歧义,单个汉字存储的话确实是占4字节(因为包含了\0),如果是连续的汉字字符串比如“你好”,所占的字节数是7个字节(每个汉字占3字节+最后的\0结束符)
ch = *target++;
这句等同
ch = *target;
target = target + 1;
也就是每一步开始就向后移动了1字节,又因为汉字占3字节,如果读到的ch是汉字,那么后面3字节空间都属于这个汉字的
想要跳过这个汉字继续读下一个字符,就应该向后移动3字节,开始已经后移了1字节,故还需要再后移2字节。
uTools_1651311285532.png
uTools_1651311332331.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-30 16:29:04 | 显示全部楼层
问题和图片有什么关联吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

不好意思,弄错图片了,我已经修改过来了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

这是图2所涉及到的程序
#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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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字节。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

 楼主| 发表于 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[MAX];
        char *target = str;
        int length = 0;

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

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

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

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

使用道具 举报

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

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

使用道具 举报

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

有时候可以有时候不行,有点奇怪,比如如果加上了逗号就不行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

好的,我知道了大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-5 20:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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