鱼C论坛

 找回密码
 立即注册
查看: 2498|回复: 2

[已解决]fgets输入中文字符并计算字符数

[复制链接]
发表于 2022-11-22 21:09:53 | 显示全部楼层 |阅读模式

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

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

x
来自C语言系列的数组与指针的课后练习的一些问题,球球哪位大神可以解答一下?


/*进阶要求:
你可能发现写出来的代码只能统计英文字符的个数,遇到中文字符结果就会出错。
请自行观察你当前系统对中文字符的处理方式,并设计一个可以统计中文字符以及中英文混合字符的程序。
        程序实现如下:
                请输入一个字符串:鱼c工作室-FishC.com
                您总共输入了15个字符*/
               
#include<stdio.h>

#define MAX 1000
int main(){
//        char test[]="中";
//        int length0 = sizeof(test)/sizeof(test[0]);
//        printf("一个中文字符占%d个字节\n",length0);
//       
//        int i;
//        for (i = 0; i < length0; i++){
//        printf("test[%d] = %d\n", i, test[i]);
//    }
/*
                运行结果:
                        length of str: 3  //为什么是3???
                        str[0] = -42
                        str[1] = -48
                        str[2] = 0

                常用字在常用编码(GB18030,BIG5)占两个字节,
                在另一个常用编码(UTF-8)占三个字节。
                生僻字一般四个字节。
                中文空间占用和编程语言基本无关,和语言编码有关。
                编码包括:国标系列编码(GB2312、GBK、GB18030),UNICODE编码(UTF8、UTF16、UTF32),BIG5编码。
                同一字符不同编码占用未必相同,同一编码不同汉字占用也不同。

*/

        char str[MAX];
        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;
}
最佳答案
2022-11-22 22:01:56
本帖最后由 jackz007 于 2022-11-22 22:06 编辑
  1.         int i=*string++ ;    // 先作为西文字符,让指针步进一个字符
  2. . . . . . .
  3.                 if((int)i<0) string+=2; // 当判断为汉字时,需要让指针再补充步进字符
复制代码

       因为前面已经让指针步进一个字符了,当判断属于中文字符的之后再额外附加步进。
       如果是 Linux 系统,采用的是 UTF-8 编码,每个汉字占用 3 个字符,需要再额外多步进 2 个字符;如果是 Windows 系统,采用的是 GBK 编码,每个汉字占用 2 个字符,需要再额外多步进一个字符。
       很显然,目前的代码状态(汉字附加步进 2 个字符)只能用于 Linux 系统。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-22 22:01:56 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-11-22 22:06 编辑
  1.         int i=*string++ ;    // 先作为西文字符,让指针步进一个字符
  2. . . . . . .
  3.                 if((int)i<0) string+=2; // 当判断为汉字时,需要让指针再补充步进字符
复制代码

       因为前面已经让指针步进一个字符了,当判断属于中文字符的之后再额外附加步进。
       如果是 Linux 系统,采用的是 UTF-8 编码,每个汉字占用 3 个字符,需要再额外多步进 2 个字符;如果是 Windows 系统,采用的是 GBK 编码,每个汉字占用 2 个字符,需要再额外多步进一个字符。
       很显然,目前的代码状态(汉字附加步进 2 个字符)只能用于 Linux 系统。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-11-23 14:13:59 | 显示全部楼层
jackz007 发表于 2022-11-22 22:01
因为前面已经让指针步进一个字符了,当判断属于中文字符的之后再额外附加步进。
       如果是 L ...

太感谢了!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-22 19:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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