fgets输入中文字符并计算字符数
来自C语言系列的数组与指针的课后练习的一些问题,球球哪位大神可以解答一下?/*进阶要求:
你可能发现写出来的代码只能统计英文字符的个数,遇到中文字符结果就会出错。
请自行观察你当前系统对中文字符的处理方式,并设计一个可以统计中文字符以及中英文混合字符的程序。
程序实现如下:
请输入一个字符串:鱼c工作室-FishC.com
您总共输入了15个字符*/
#include<stdio.h>
#define MAX 1000
int main(){
// char test[]="中";
// int length0 = sizeof(test)/sizeof(test);
// printf("一个中文字符占%d个字节\n",length0);
//
// int i;
// for (i = 0; i < length0; i++){
// printf("test[%d] = %d\n", i, test);
// }
/*
运行结果:
length of str: 3//为什么是3???
str = -42
str = -48
str = 0
常用字在常用编码(GB18030,BIG5)占两个字节,
在另一个常用编码(UTF-8)占三个字节。
生僻字一般四个字节。
中文空间占用和编程语言基本无关,和语言编码有关。
编码包括:国标系列编码(GB2312、GBK、GB18030),UNICODE编码(UTF8、UTF16、UTF32),BIG5编码。
同一字符不同编码占用未必相同,同一编码不同汉字占用也不同。
*/
char str;
char *string=str;
printf("请输入一个字符串:");
fgets(str,MAX,stdin);
int length=0;
// while(*string++!='\0'){
// if((int)*string++ <0) string+=2;
// length++;
// }
// 错因:string进行了两次后++
while(1){
int i=*string++;
if(i=='\0') break;
if((int)i<0) string+=2; //为什么是+2??? 中文字符占3个字节或4个字节都是+2?
length++;
}
printf("您总共输入了%d个字符.",length-1);
//为什么标点符号不计入字符中???答案也没有计入???
return 0;
} 本帖最后由 jackz007 于 2022-11-22 22:06 编辑
int i=*string++ ; // 先作为西文字符,让指针步进一个字符
. . . . . .
if((int)i<0) string+=2; // 当判断为汉字时,需要让指针再补充步进字符
因为前面已经让指针步进一个字符了,当判断属于中文字符的之后再额外附加步进。
如果是 Linux 系统,采用的是 UTF-8 编码,每个汉字占用 3 个字符,需要再额外多步进 2 个字符;如果是 Windows 系统,采用的是 GBK 编码,每个汉字占用 2 个字符,需要再额外多步进一个字符。
很显然,目前的代码状态(汉字附加步进 2 个字符)只能用于 Linux 系统。 jackz007 发表于 2022-11-22 22:01
因为前面已经让指针步进一个字符了,当判断属于中文字符的之后再额外附加步进。
如果是 L ...
太感谢了!!!
页:
[1]