鱼C论坛

 找回密码
 立即注册
查看: 2029|回复: 3

[已解决]计算中文字符长度

[复制链接]
发表于 2023-11-6 19:34:58 | 显示全部楼层 |阅读模式

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

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

x
  1. #include <stdio.h>

  2. #define MAX 1024

  3. int main()
  4. {
  5.         char str[MAX];
  6.         char *target = str;
  7.         char ch;
  8.         int length = 0;

  9.         printf("请输入一个字符串:");
  10.         fgets(str, MAX, stdin);

  11.         while (1)
  12.         {
  13.                 ch = *target++;
  14.                 if (ch == '\0')
  15.                 {
  16.                         break;
  17.                 }
  18.                 if ((int)ch < 0)
  19.                 {
  20.                         target += 2;
  21.                 }
  22.                 length++;
  23.         }

  24.         printf("您总共输入了 %d 个字符!\n", length - 1);

  25.         return 0;
  26. }
复制代码

每个中文字符在系统中是占用 4 个字节的存储空间,为什么如果是(中文字符),则将指针往后移动两个字节,而不是移动4个字节?
最佳答案
2023-11-7 10:27:36
本帖最后由 xiaotubie 于 2023-11-7 10:36 编辑

跟编码有关,不一定就是4个字节,大多数情况反而是2个字节,看下当前环境下,一个汉字占多少字节就行了。
const char str[] = "中";
printf("%d",sizeof str) ; 在我的机子上输出是3,除去字符串最后的'\0'结尾占1个字节,那么这里的汉字  中  就是占2个字节。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-11-6 19:35:31 | 显示全部楼层
中文字符在系统中占用的存储空间确实是4个字节,但是这段代码中的逻辑是错误的。移动指针2个字节是不正确的。

在这段代码中,当遇到一个字符时,会先判断该字符是否为0,如果是0则退出循环,否则继续执行。然后会判断该字符是否小于0,如果小于0则移动指针2个字节,否则增加长度计数器。这里的判断逻辑是错误的。

正确的做法是,判断该字符是否大于0,如果大于0则增加长度计数器,否则移动指针4个字节。因为中文字符的编码范围是大于0的,所以当遇到中文字符时,应该增加长度计数器并移动指针4个字节。

修正后的代码如下:

  1. #include <stdio.h>

  2. #define MAX 1024

  3. int main()
  4. {
  5.     char str[MAX];
  6.     char *target = str;
  7.     char ch;
  8.     int length = 0;

  9.     printf("请输入一个字符串:");
  10.     fgets(str, MAX, stdin);

  11.     while (1)
  12.     {
  13.         ch = *target++;
  14.         if (ch == '\0')
  15.         {
  16.             break;
  17.         }
  18.         if ((int)ch > 0)
  19.         {
  20.             length++;
  21.         }
  22.         else
  23.         {
  24.             target += 4;
  25.         }
  26.     }

  27.     printf("您总共输入了 %d 个字符!\n", length);

  28.     return 0;
  29. }
复制代码


修正后的代码会正确计算中文字符的长度。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-6 19:36:37 | 显示全部楼层
在C/C++中,字符的存储是按照字节进行的。对于ASCII字符来说,每个字符占用1个字节。而对于Unicode字符集中的中文字符(汉字),通常采用UTF-8编码,每个中文字符占用3个字节。因此,在计算中文字符长度时,需要考虑每个字节的情况。

在给定的代码中,通过逐个判断字符的方式来计算字符串的长度。当遇到中文字符时,根据目前常见的UTF-8编码规则,中文字符的每个字节的最高位都为1,因此判断某个字符是否是中文字符的方法是检查其最高位是否为1。如果最高位为1,则说明该字符是中文字符。

在代码中,当检测到字符的最高位为1时,将指针往后移动2个字节,而不是4个字节。这是因为在UTF-8编码中,一个中文字符的第一个字节的最高5位为1,第6位为0。而剩下的两个字节的最高两位为10。所以,为了跳过该中文字符的两个字节,将指针往后移动2个字节。

换句话说,以UTF-8编码表示的中文字符,其字节长度可以变化,但是通过判断最高位为1来确定该字符为中文字符,并且根据编码规则跳过相应的字节数。

希望这个解答对你有帮助。如果还有其他问题,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-7 10:27:36 | 显示全部楼层    本楼为最佳答案   
本帖最后由 xiaotubie 于 2023-11-7 10:36 编辑

跟编码有关,不一定就是4个字节,大多数情况反而是2个字节,看下当前环境下,一个汉字占多少字节就行了。
const char str[] = "中";
printf("%d",sizeof str) ; 在我的机子上输出是3,除去字符串最后的'\0'结尾占1个字节,那么这里的汉字  中  就是占2个字节。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-22 01:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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