Suud 发表于 2023-11-29 20:35:55

关于getchar的问题

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

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

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

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

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

int main(void)
{
    int n, a, e, i, o, u;
    scanf("%d", &n);
    getchar();
    char c;
    while (n--)
    {
      a = e = i = o = u = 0;
      do
      {
            c = getchar();
            if (c == 'a' || c == 'A')
                a++;
            else if (c == 'e' || c == 'E')
                e++;
            else if (c == 'i' || c == 'I')
                i++;
            else if (c == 'o' || c == 'O')
                o++;
            else if (c == 'u' || c == 'U')
                u++;
      } while (c != '\n');
      if (n)
            printf("a:%d\ne:%d\ni:%d\no:%d\nu:%d\n\n", a, e, i, o, u);
      else
            printf("a:%d\ne:%d\ni:%d\no:%d\nu:%d", a, e, i, o, u);
    }
    return 0;
}

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

int main(void)
{
    int n, a, e, i, o, u;
    scanf("%d", &n);
    getchar();
    char c;
    while (n--)
    {
      a = e = i = o = u = 0;
      do
      {
            c = getchar();
            if (c == 'a' || c == 'A')
                a++;
            else if (c == 'e' || c == 'E')
                e++;
            else if (c == 'i' || c == 'I')
                i++;
            else if (c == 'o' || c == 'O')
                o++;
            else if (c == 'u' || c == 'U')
                u++;
      } while (c != '\n' && c != -1);
      if (n)
            printf("a:%d\ne:%d\ni:%d\no:%d\nu:%d\n\n", a, e, i, o, u);
      else
            printf("a:%d\ne:%d\ni:%d\no:%d\nu:%d", a, e, i, o, u);
    }
    return 0;
}

FishC_GPT 发表于 2023-11-29 20:36:24

首先,你需要使用一个循环来遍历每一行字符串。然后,在每一行中,你需要再次使用一个循环来遍历每一个字符。

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

下面是一个示例代码,用于解决这个问题:

#include <stdio.h>

int main() {
    int n;
    scanf("%d", &n);

    // 清空输入缓冲区
    while (getchar() != '\n');

    for (int i = 0; i < n; i++) {
      // 初始化元音字母的计数器
      int count = {0};

      // 读取一行字符串
      char c;
      while ((c = getchar()) != '\n') {
            // 判断字符是否为元音字母
            if (c == 'a' || c == 'A') {
                count++;
            } else if (c == 'e' || c == 'E') {
                count++;
            } else if (c == 'i' || c == 'I') {
                count++;
            } else if (c == 'o' || c == 'O') {
                count++;
            } else if (c == 'u' || c == 'U') {
                count++;
            }
      }

      // 输出该行字符串中元音字母的出现次数
      printf("Case %d:\n", i + 1);
      printf("a:%d\n", count);
      printf("e:%d\n", count);
      printf("i:%d\n", count);
      printf("o:%d\n", count);
      printf("u:%d\n", count);

      // 输出换行符,用于分隔每一行的结果
      printf("\n");
    }

    return 0;
}

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

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。

wansurong 发表于 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 = {0};      // 读取一行字符串      char c;      while ((c = getchar()) != '\n') {            // 判断字符是否为元音字母            if (c == 'a' || c == 'A') {                count++;            } else if (c == 'e' || c == 'E') {                count++;            } else if (c == 'i' || c == 'I') {                count++;            } else if (c == 'o' || c == 'O') {                count++;            } else if (c == 'u' || c == 'U') {                count++;            }      }      // 输出该行字符串中元音字母的出现次数      printf("Case %d:\n", i + 1);      printf("a:%d\n", count);      printf("e:%d\n", count);      printf("i:%d\n", count);      printf("o:%d\n", count);      printf("u:%d\n", count);      // 输出换行符,用于分隔每一行的结果      printf("\n");    }    return 0;}

sunnovahao 发表于 2023-12-6 08:49:17

题目中还有一个条件是文件结尾(EOF)。文件结尾没有存在换行符,而EOF的值为-1

Suud 发表于 2023-12-6 20:21:34

sunnovahao 发表于 2023-12-6 08:49
题目中还有一个条件是文件结尾(EOF)。文件结尾没有存在换行符,而EOF的值为-1

这样啊,谢谢!
页: [1]
查看完整版本: 关于getchar的问题