乌龙茶不加糖 发表于 2022-11-22 21:09:53

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:01:56

本帖最后由 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 系统。

乌龙茶不加糖 发表于 2022-11-23 14:13:59

jackz007 发表于 2022-11-22 22:01
因为前面已经让指针步进一个字符了,当判断属于中文字符的之后再额外附加步进。
       如果是 L ...

太感谢了!!!
页: [1]
查看完整版本: fgets输入中文字符并计算字符数