英文字母和中文字符再数组中的存储(统计中文字符以及中英文混合字符的程序)
一处疑问在后面的注释上,求解!!!#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;
} 每个中文字符在我们的系统中是占用 3 个字节的存储空间,并且都是负数。以此规律,我们只要检测一个字符对应的整型值是否为负数,如果是(中文字符),则将指针往后移动两个字节。 本帖最后由 行客 于 2019-1-26 17:56 编辑
if ((int)ch < 0) //这个位置只知道是用来判断中文字符的,但是不知道什么原理,求解!!!!!!!!!!!
{
target += 2;
}
这段代码的本意是判断如果是中文,则指针向后移动2位,也就是中文字符也计算为1,否则中文字符占2个字节,计算值时会加成2。
但最大的问题是,if ((int)ch < 0)这个判断本身就不严谨。如果只是用ASCII码小于0来判断是否为中文其实不一定正确,日文、韩文等都会小于0。
另外,中文是占两个字节,所以上面代码应该修改为
if ((int)ch < 0) //这个位置只知道是用来判断中文字符的,但是不知道什么原理,求解!!!!!!!!!!!
{
target += 1;
}
整体代码为:
#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 += 1;//注意这里
}
length++;
}
printf("您总共输入了 %d 个字符!\n", length - 1);
return 0;
} Fed_22th 发表于 2019-1-26 17:37
每个中文字符在我们的系统中是占用 3 个字节的存储空间,并且都是负数。以此规律,我们只要检测一个字符对 ...
不是3字节,是2字节。 行客 发表于 2019-1-26 17:57
不是3字节,是2字节。
好像linux是三字节,windows是2 culifoo 发表于 2019-1-27 21:48
好像linux是三字节,windows是2
嗯 小甲鱼给的答案是三个字节 应该说的是他的linux 行客 发表于 2019-1-26 17:38
if ((int)ch < 0) //这个位置只知道是用来判断中文字符的,但是不知道什么原理, ...
好的谢谢
页:
[1]