You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加getchar()后字符串字符频率统计程序结果异常的原因咨询

问题原因与解决方案:添加getchar()后字符频率统计结果异常

嘿,我来帮你捋清楚这个问题!你遇到的情况是典型的输入缓冲区残留字符导致的bug,咱们一步步拆解:

问题根源分析

先看你代码里的输入流程:

  1. 你用fgets(a, 30, stdin)读取用户输入的句子,这个函数会把用户输入的整行内容(包括最后按下的回车符\n)都存进数组a里。
  2. 接着用scanf("%c", &c)读取要统计的字符:当你输入目标字符(比如'a')后按下回车,scanf只会读取'a',而回车符\n会留在输入缓冲区里。
  3. 这时候你多写了一行c = getchar();——这个函数会把缓冲区里剩下的\n读取出来,直接覆盖掉你刚用scanf读到的目标字符!
  4. 最后统计的时候,你实际在找的是\n的出现次数,而fgets已经把换行符存在数组a里了,所以不管你输入什么目标字符,结果都会是1。

而你不加getchar()的时候,c保存的是你真正想统计的字符,所以程序运行正常,逻辑是对的。

修正方案

有几种简单的办法可以解决这个问题,选你习惯的就行:

方案1:删掉多余的getchar(),并优化scanf读取

直接去掉c = getchar();这行,同时把scanf改成带空格的格式,这样能自动跳过输入缓冲区里的空白字符(包括换行、空格),避免后续可能的干扰:

#include <stdio.h>
int main(void) {
    char a[30],c;
    int i,t=0;
    printf("Enter your sentence:");
    fgets(a, 30, stdin);
    printf("%s",a);
    printf("Enter the character you want to check:");
    scanf(" %c",&c); // 注意%c前面的空格,用来跳过空白字符
    for(i=0; a[i] != '\0';i++) {
        if (a[i] == c) ++t;
    }
    printf("the frequency of the character %c is :%d",c,t);
    return 0;
}

方案2:保留getchar()但不要覆盖目标字符

如果你非要用getchar(),可以用它来吃掉缓冲区里的换行符,而不是赋值给c:

scanf("%c",&c);
getchar(); // 这里只清理缓冲区,不修改c的值

额外提示

以后处理输入的时候要注意:scanf对空白字符的处理是分情况的,%c会读取任何字符(包括空白),而其他格式符(比如%d、%s)会自动跳过空白。如果混用不同的输入函数(比如fgets和scanf),一定要留意输入缓冲区里的残留字符,避免出现这种“莫名其妙”的bug。

内容的提问来源于stack exchange,提问作者programmer99

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 09:38:14