添加getchar()后字符串字符频率统计程序结果异常的原因咨询
问题原因与解决方案:添加
getchar()后字符频率统计结果异常 嘿,我来帮你捋清楚这个问题!你遇到的情况是典型的输入缓冲区残留字符导致的bug,咱们一步步拆解:
问题根源分析
先看你代码里的输入流程:
- 你用
fgets(a, 30, stdin)读取用户输入的句子,这个函数会把用户输入的整行内容(包括最后按下的回车符\n)都存进数组a里。 - 接着用
scanf("%c", &c)读取要统计的字符:当你输入目标字符(比如'a')后按下回车,scanf只会读取'a',而回车符\n会留在输入缓冲区里。 - 这时候你多写了一行
c = getchar();——这个函数会把缓冲区里剩下的\n读取出来,直接覆盖掉你刚用scanf读到的目标字符! - 最后统计的时候,你实际在找的是
\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
相关产品推荐
相关产品推荐

