鱼C论坛

 找回密码
 立即注册
查看: 2272|回复: 24

[已解决]统计中英文字符的程序

[复制链接]
发表于 2023-8-1 20:08:38 | 显示全部楼层 |阅读模式

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

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

x
题目要求是设计一个可以统计中文字符以及中英文混合字符的程序c语言程序。 要求使用fgets 函数读取用户输入的字符串(英文),并用指针法来计算字符串的字符个数且不能使用strlen 函数


  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MAX 1024

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

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

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

  25.   printf("您总共输入了 %d 个字符!\n", length - 1);
  26.   system("pause");
  27.   return 0;
  28. }
复制代码


但是小甲鱼一个中文字符是占了4个字节,我一个中文字符是占了3个字节,要怎么样更改小甲鱼的程序才能实现小甲鱼的程序结果
最佳答案
2023-8-1 21:28:26
1613551 发表于 2023-8-1 18:14
这个也还是原来那个代码
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MAX 1024

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

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

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

  25.   printf("您总共输入了 %d 个字符!\n", length - 1);
  26.   system("pause");
  27.   return 0;
  28. }

复制代码


又放错了,我是S*
长图_2023-08-01.png
uTools_1690891706086.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-8-1 20:08:56 | 显示全部楼层
修改统计中英文字符的程序

以下是修改后的程序,使其能够正确统计中文字符的个数:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MAX 1024
  4. int isChinese(char ch)
  5. {
  6.     if ((ch & 0x80) && !(ch & 0x40))
  7.         return 1;
  8.     return 0;
  9. }
  10. int main()
  11. {
  12.     char str[MAX];
  13.     char *target = str;
  14.     char ch;
  15.     int length = 0;
  16.     printf("请输入一个字符串:");
  17.     fgets(str, MAX, stdin);
  18.     while (1)
  19.     {
  20.         ch = *target++;
  21.         if (ch == '\0')
  22.         {
  23.             break;
  24.         }
  25.         if (isChinese(ch))
  26.         {
  27.             target += 2;
  28.         }
  29.         length++;
  30.     }
  31.     printf("您总共输入了 %d 个字符!\n", length - 1);
  32.     system("pause");
  33.     return 0;
  34. }
复制代码

修改内容如下:
1. 添加 isChinese 函数,用于判断字符是否为中文字符。该函数通过判断字符的高位和次高位是否满足中文字符的编码规则来确定。
2. 在主函数中调用 isChinese 函数,如果当前字符是中文字符,则将指针向后偏移2个位置。
3. 运行结果中的字符个数需要减去1,因为最后输入的换行符也被计算在内。

希望这次能够满足你的需求,如果还有其他问题,请随时提问。

如果回答对你有帮助,请给我一个最佳答案!

评分

参与人数 1荣誉 +3 贡献 +1 收起 理由
1613551 + 3 + 1

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-1 20:09:03 | 显示全部楼层
小甲鱼的程序是基于一个中文字符占4个字节的假设来实现的。如果你的系统中一个中文字符是占3个字节,那么需要对程序进行相应的修改。

在处理中文字符时,一个中文字符通常会由多个字节组成。在UTF-8编码中,一个中文字符通常由3个字节表示,而在其他编码中,可能会由4个字节表示。要根据实际情况修改程序,可以参考以下步骤:

1. 替换长度计算方式:由于中文字符的长度不再是固定的,需要修改长度计算的方式。可以使用一个循环来遍历输入的字符串,然后根据每个字符的字节来决定是否增加字符个数。

2. 判断中文字符:由于一个中文字符可能由多个字节组成,需要进行判断来确定是否遇到了中文字符。

3. 修改长度增加方式:当遇到中文字符时,根据实际的字节数增加字符个数。

以下是修改后的程序:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MAX 1024

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

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

  12.     while (1)
  13.     {
  14.         ch = *target++;
  15.         if (ch == '\0')
  16.         {
  17.             break;
  18.         }
  19.         // 判断是否遇到中文字符(假设一个中文字符占3个字节)
  20.         if ((ch & 0x80) != 0) // 判断最高位是否为1,如果为1则说明该字节属于中文字符的一部分
  21.         {
  22.             int count = 0;
  23.             // 统计中文字符的字节数
  24.             while ((ch & 0x80) != 0)
  25.             {
  26.                 ch = ch << 1;
  27.                 count++;
  28.             }
  29.             target += count - 1; // 跳过该中文字符的其他字节
  30.         }
  31.         length++;
  32.     }

  33.     printf("您总共输入了 %d 个字符!\n", length - 1);
  34.     system("pause");
  35.     return 0;
  36. }
复制代码


上述修改后的程序使用了位运算来判断是否遇到中文字符,并根据中文字符的字节数跳过相应的字节,从而正确计算中英文字符的个数。请注意,这里假设一个中文字符占3个字节,你需要根据你的实际情况进行相应的调整。

评分

参与人数 1荣誉 +3 贡献 +1 收起 理由
1613551 + 3 + 1

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-1 20:15:13 | 显示全部楼层
要根据你所描述的情况,修改小甲鱼的程序来正确统计中英文字符的个数,可以按照以下方式进行修改:


  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MAX 1024

  4. int getCharacterCount(const char *str)
  5. {
  6.     int count = 0;
  7.     while (*str)
  8.     {
  9.         if (((*str & 0xC0) != 0x80)) // 判断是否是一个字符的开始字节
  10.         {
  11.             count++;
  12.         }
  13.         str++;
  14.     }
  15.     return count;
  16. }

  17. int main()
  18. {
  19.     char str[MAX];

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

  22.     int length = getCharacterCount(str);

  23.     printf("您总共输入了 %d 个字符!
  24. ", length);
  25.     system("pause");
  26.     return 0;
  27. }
复制代码


在这个修改后的程序中,我们添加了一个名为getCharacterCount的函数,用来统计中英文字符的个数。该函数使用了位操作来判断一个字符的开始字节,从而正确地统计中英文字符的个数。   

main函数中,我们调用getCharacterCount函数来获取字符串的字符个数,并打印结果。

这样修改后的程序应该能正确地统计中英文字符的个数。请尝试运行修改后的代码并输入测试字符串进行验证。如果有任何问题,请随时提问。

评分

参与人数 1荣誉 +2 贡献 +2 收起 理由
1613551 + 2 + 2

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-1 20:16:34 | 显示全部楼层
isdkz 发表于 2023-8-1 20:09
小甲鱼的程序是基于一个中文字符占4个字节的假设来实现的。如果你的系统中一个中文字符是占3个字节,那么需 ...

好像不太对
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-1 20:16:50 | 显示全部楼层
给个最佳答案呗求你了!!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-1 20:17:03 | 显示全部楼层
uTools_1690892175721.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-8-1 20:19:03 | 显示全部楼层
本帖最后由 Mike_python小 于 2023-8-1 17:20 编辑

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MAX 1024

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

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

  12.     while (1)
  13.     {
  14.         ch = *target++;
  15.         if (ch == '\0')
  16.         {
  17.             break;
  18.         }
  19.         // 判断是否遇到中文字符(假设一个中文字符占3个字节)
  20.         if ((ch & 0x80) != 0) // 判断最高位是否为1,如果为1则说明该字节属于中文字符的一部分
  21.         {
  22.             int count = 0;
  23.             // 统计中文字符的字节数
  24.             while ((ch & 0x80) != 0)
  25.             {
  26.                 ch = ch << 1;
  27.                 count++;
  28.             }
  29.             target += count - 1; // 跳过该中文字符的其他字节
  30.         }
  31.         length++;
  32.     }

  33.     printf("您总共输入了 %d 个字符!\n", length - 2);
  34.     system("pause");
  35.     return 0;
  36. }
复制代码


改了一下isdkz的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-1 20:20:16 | 显示全部楼层

我只是想在小甲鱼的程序上稍加修改
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-1 20:20:26 | 显示全部楼层
本帖最后由 学习编程中的Ben 于 2023-8-1 20:23 编辑

给个最佳答案呗 求你了!!!
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MAX 1024

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

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

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

  25.   printf("您总共输入了 %d 个字符!\n", length - 1);
  26.   system("pause");
  27.   return 0;
  28. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-1 20:21:31 | 显示全部楼层
1613551 发表于 2023-8-1 17:20
我只是想在小甲鱼的程序上稍加修改
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MAX 1024

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

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

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

  25.   printf("您总共输入了 %d 个字符!\n", length - 1);
  26.   system("pause");
  27.   return 0;
  28. }
复制代码


这个呢,可以试试
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-1 20:23:22 | 显示全部楼层
1613551 发表于 2023-8-1 17:20
我只是想在小甲鱼的程序上稍加修改

在这个修改后的程序中,我们使用位操作来判断一个字符是否是一个中文字符的开始字节。对于一个占据3个字节的中文字符,其开始字节的高4位应为1110(0xE0),因此我们使用(*target & 0xF0) == 0xE0来判断是否是中文字符的开始字节。

如果是中文字符的开始字节,我们将指针target向后移动3个字节,并增加字符计数length。

如果不是中文字符的开始字节,我们将指针target向后移动1个字节,并增加字符计数length。

这样修改后的程序应该能正确地统计基于一个中文字符占据3个字节的字符串字符个数。请尝试运行修改后的代码并输入测试字符串进行验证。如果有任何问题,请随时提问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-1 20:23:51 | 显示全部楼层
学习编程中的Ben 发表于 2023-8-1 17:20
给个最佳答案呗 求你了!!!

抄我代码干嘛
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-1 20:28:47 | 显示全部楼层

你可以去了解一下,领先优势,我在你上面,那么你就没有办法说我超了你的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-1 20:29:46 | 显示全部楼层
学习编程中的Ben 发表于 2023-8-1 17:28
你可以去了解一下,领先优势,我在你上面,那么你就没有办法说我超了你的

笑死,我先发的代码,结果你在上面编辑你帖子,又告诉我领先优势,你隔着当我shb呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-1 20:30:47 | 显示全部楼层
Mike_python小 发表于 2023-8-1 20:29
笑死,我先发的代码,结果你在上面编辑你帖子,又告诉我领先优势,你隔着当我shb呢?

诶呦喂,你干嘛,不要在意小细节(火速开溜)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-1 20:31:10 | 显示全部楼层
学习编程中的Ben 发表于 2023-8-1 17:30
诶呦喂,你干嘛,不要在意小细节(火速开溜)

截图了

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
学习编程中的Ben + 5 + 5 开个玩笑嘛~

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-1 20:33:21 | 显示全部楼层
学习编程中的Ben 发表于 2023-8-1 17:30
诶呦喂,你干嘛,不要在意小细节(火速开溜)

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-1 20:47:49 | 显示全部楼层
汉字占3字节??
我的理解是不换电脑就解决不了,

评分

参与人数 4荣誉 +10 收起 理由
myd0311 + 2
Frog_Belly + 1 鱼C有你更精彩^_^
zhangjinxuan + 5
myd0313 + 2

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-1 20:49:45 | 显示全部楼层
unsigned_int 发表于 2023-8-1 17:47
汉字占3字节??
我的理解是不换电脑就解决不了,

UTF8编码就是3字节
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-9 20:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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