鱼C论坛

 找回密码
 立即注册
查看: 660|回复: 4

[已解决]关于getchar的问题

[复制链接]
发表于 2023-11-29 20:35:55 | 显示全部楼层 |阅读模式

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

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

x
这是我们学校OJ的一道题目:

给定n行字符串,请统计每行字符串中元音aeiou出现的次数,并且输出各元音的出现次数的统计表。
数据范围:
0<n<1000,0<字符串长度<100000

输入
第一行为一个整数n,表示要统计的字符串行数。从第二行开始到文件结尾是n行字符串。

输出
n个元音出现次数统计表,每个统计表之间用空行隔开,最后一张统计表的结束没有空行


一开始提交的代码是这样的:
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.     int n, a, e, i, o, u;
  5.     scanf("%d", &n);
  6.     getchar();
  7.     char c;
  8.     while (n--)
  9.     {
  10.         a = e = i = o = u = 0;
  11.         do
  12.         {
  13.             c = getchar();
  14.             if (c == 'a' || c == 'A')
  15.                 a++;
  16.             else if (c == 'e' || c == 'E')
  17.                 e++;
  18.             else if (c == 'i' || c == 'I')
  19.                 i++;
  20.             else if (c == 'o' || c == 'O')
  21.                 o++;
  22.             else if (c == 'u' || c == 'U')
  23.                 u++;
  24.         } while (c != '\n');
  25.         if (n)
  26.             printf("a:%d\ne:%d\ni:%d\no:%d\nu:%d\n\n", a, e, i, o, u);
  27.         else
  28.             printf("a:%d\ne:%d\ni:%d\no:%d\nu:%d", a, e, i, o, u);
  29.     }
  30.     return 0;
  31. }
复制代码


然后OJ显示10个样例里有8个错误
而我们学校的OJ看不到正确输出与我的输出的对比,所以没法直接看错在哪
然后我把 while (c != '\n'); 改成 while (c != '\n' && c != -1); 之后,OJ就通过了
这是为什么?
下面是通过的代码:
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.     int n, a, e, i, o, u;
  5.     scanf("%d", &n);
  6.     getchar();
  7.     char c;
  8.     while (n--)
  9.     {
  10.         a = e = i = o = u = 0;
  11.         do
  12.         {
  13.             c = getchar();
  14.             if (c == 'a' || c == 'A')
  15.                 a++;
  16.             else if (c == 'e' || c == 'E')
  17.                 e++;
  18.             else if (c == 'i' || c == 'I')
  19.                 i++;
  20.             else if (c == 'o' || c == 'O')
  21.                 o++;
  22.             else if (c == 'u' || c == 'U')
  23.                 u++;
  24.         } while (c != '\n' && c != -1);
  25.         if (n)
  26.             printf("a:%d\ne:%d\ni:%d\no:%d\nu:%d\n\n", a, e, i, o, u);
  27.         else
  28.             printf("a:%d\ne:%d\ni:%d\no:%d\nu:%d", a, e, i, o, u);
  29.     }
  30.     return 0;
  31. }
复制代码
最佳答案
2023-12-6 08:49:17
题目中还有一个条件是文件结尾(EOF)。文件结尾没有存在换行符,而EOF的值为-1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-29 20:36:24 | 显示全部楼层
首先,你需要使用一个循环来遍历每一行字符串。然后,在每一行中,你需要再次使用一个循环来遍历每一个字符。

在这个内层循环中,你可以使用 `getchar()` 函数来逐个读取字符,并判断它是否是元音字母。如果字符是元音字母之一(即 `a`、`e`、`i`、`o`、`u`),你可以使用一个计数器变量来记录该元音字母的出现次数。

下面是一个示例代码,用于解决这个问题:
  1. #include <stdio.h>
  2. int main() {
  3.     int n;
  4.     scanf("%d", &n);
  5.     // 清空输入缓冲区
  6.     while (getchar() != '\n');
  7.     for (int i = 0; i < n; i++) {
  8.         // 初始化元音字母的计数器
  9.         int count[5] = {0};
  10.         // 读取一行字符串
  11.         char c;
  12.         while ((c = getchar()) != '\n') {
  13.             // 判断字符是否为元音字母
  14.             if (c == 'a' || c == 'A') {
  15.                 count[0]++;
  16.             } else if (c == 'e' || c == 'E') {
  17.                 count[1]++;
  18.             } else if (c == 'i' || c == 'I') {
  19.                 count[2]++;
  20.             } else if (c == 'o' || c == 'O') {
  21.                 count[3]++;
  22.             } else if (c == 'u' || c == 'U') {
  23.                 count[4]++;
  24.             }
  25.         }
  26.         // 输出该行字符串中元音字母的出现次数
  27.         printf("Case %d:\n", i + 1);
  28.         printf("a:%d\n", count[0]);
  29.         printf("e:%d\n", count[1]);
  30.         printf("i:%d\n", count[2]);
  31.         printf("o:%d\n", count[3]);
  32.         printf("u:%d\n", count[4]);
  33.         // 输出换行符,用于分隔每一行的结果
  34.         printf("\n");
  35.     }
  36.     return 0;
  37. }
复制代码

你可以根据需要进行修改和调整。希望对你有所帮助!

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-30 10:34:23 | 显示全部楼层
#include <stdio.h>int main() {    int n;    scanf("%d", &n);    // 清空输入缓冲区    while (getchar() != '\n');    for (int i = 0; i < n; i++) {        // 初始化元音字母的计数器        int count[5] = {0};        // 读取一行字符串        char c;        while ((c = getchar()) != '\n') {            // 判断字符是否为元音字母            if (c == 'a' || c == 'A') {                count[0]++;            } else if (c == 'e' || c == 'E') {                count[1]++;            } else if (c == 'i' || c == 'I') {                count[2]++;            } else if (c == 'o' || c == 'O') {                count[3]++;            } else if (c == 'u' || c == 'U') {                count[4]++;            }        }        // 输出该行字符串中元音字母的出现次数        printf("Case %d:\n", i + 1);        printf("a:%d\n", count[0]);        printf("e:%d\n", count[1]);        printf("i:%d\n", count[2]);        printf("o:%d\n", count[3]);        printf("u:%d\n", count[4]);        // 输出换行符,用于分隔每一行的结果        printf("\n");    }    return 0;}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-6 08:49:17 | 显示全部楼层    本楼为最佳答案   
题目中还有一个条件是文件结尾(EOF)。文件结尾没有存在换行符,而EOF的值为-1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-6 20:21:34 | 显示全部楼层
sunnovahao 发表于 2023-12-6 08:49
题目中还有一个条件是文件结尾(EOF)。文件结尾没有存在换行符,而EOF的值为-1

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-13 03:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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