如果字符数组里面的值是中文怎么处理?
本帖最后由 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
问题和图片有什么关联吗
不好意思,弄错图片了,我已经修改过来了 图一是题目要求,图二是小甲鱼给的解释
这是图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;
} 因为不同的编码格式中,汉字所占字节数会有所不同。所以先通过图上代码测试出实验环境中的汉字所占字节数。
图上说每个汉字占4字节应该具有一定歧义,单个汉字存储的话确实是占4字节(因为包含了\0),如果是连续的汉字字符串比如“你好”,所占的字节数是7个字节(每个汉字占3字节+最后的\0结束符)
ch = *target++;
这句等同
ch = *target;
target = target + 1;
也就是每一步开始就向后移动了1字节,又因为汉字占3字节,如果读到的ch是汉字,那么后面3字节空间都属于这个汉字的
想要跳过这个汉字继续读下一个字符,就应该向后移动3字节,开始已经后移了1字节,故还需要再后移2字节。 LINUX 操作系统字符采用 utf-8 编码,每个西文字符占用 1 个字节,中文字符占用 3 个字节,在 WINDOWS 系统上,字符采用 gbk 编码,每个西文字符任然占用 1 个字节,但是,每个中文字符占用的是 2 个字节,楼主的代码只能适合在 LINUX 系统下使用,如果要在 WINDOWS 系统下,这个代码是需要修改的。 风车呼呼呼 发表于 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;
} 1613551 发表于 2022-5-1 13:06
懂了,可是我发现小甲鱼这个代码实现不了这个功能,不知道是不是我编译器的问题,但是我编译器上,一个中 ...
你这个我运行 能得到的只是字节数,不是字符数。你用的小甲鱼代码实现不了吗
有没有亲手实验一下每个汉字占多少字节?
fgets之后把str字符串打印出来确保输入没有问题,然后把每个字节的内容按%d打印出来,检查输入的汉字有多少字节,根据每个字节的内容手动走一遍自己的循环。当然如果会调试就直接调试 风车呼呼呼 发表于 2022-5-1 14:04
你这个我运行 能得到的只是字节数,不是字符数。你用的小甲鱼代码实现不了吗
有没有亲手实验一下每个汉 ...
有时候可以有时候不行,有点奇怪,比如如果加上了逗号就不行了 1613551 发表于 2022-5-1 15:45
有时候可以有时候不行,有点奇怪,比如如果加上了逗号就不行了
只要不是同样的输入得到过不同的输出,那代码本身基本不会有问题。
如果是直接复制小甲鱼的代码,而且确定环境中汉字是3字节存储(UTF-8编码大部分常用汉字是3字节,但也有4字节的汉字),问题就可能出在你输入的内容上面。
你在输入内容中带上逗号,那么这个逗号是英文的还是中文的,如果是中文的,是否也和一个汉字一样占着3字节空间,每个字节强制转换整型的数字是否也是负数。能测试的方面有很多 风车呼呼呼 发表于 2022-5-1 16:38
只要不是同样的输入得到过不同的输出,那代码本身基本不会有问题。
如果是直接复制小甲鱼的代码,而且确 ...
好的,我知道了大佬
页:
[1]