C语言统计输入'A'、'B'数量程序输入异常问题求助
问题原因
scanf的%c格式符会读取所有ASCII字符,包括输入数字n后按下的换行符、输入内容之间的空格、换行等空白字符,这些都会被算作一次有效读取占用计数。如果每输入1个字符就按一次回车,一次操作会读入「有效字符+回车」两个内容,输入5个字符就占满10次读取额度,自然无法继续输入后续内容。- 循环条件写为
i<=n,原本要读取n个字符,实际会多执行1次读取,逻辑不符合需求。 - 字符判断逻辑
cr='A'是赋值操作而非相等判断,该表达式永远为真,所有读入的字符都会被计入A的数量,判断逻辑完全错误。
修复方案
修复后参考代码如下:
#include <stdio.h> int main() { int n, i, a=0, b=0; char cr; scanf("%i", &n); getchar(); // 清除输入n后残留在输入缓冲区的换行符 for (i=0; i<n; i++) { scanf("%c", &cr); // 跳过空白字符,不纳入计数 if (cr == ' ' || cr == '\n') { i--; continue; } if (cr == 'A') { a++; } else if (cr == 'B') { b++; } } printf("A-%i\n", a); printf("B-%i", b); return 0; }
如果不需要处理空白字符过滤,也可以直接在%c前加空格,让scanf自动跳过所有前置空白字符,代码可以简化为:
#include <stdio.h> int main() { int n, i, a=0, b=0; char cr; scanf("%i", &n); // %c前加空格自动跳过所有空白字符 for (i=0; i<n; i++) { scanf(" %c", &cr); if (cr == 'A') { a++; } else if (cr == 'B') { b++; } } printf("A-%i\n", a); printf("B-%i", b); return 0; }
内容的提问来源于stack exchange,提问作者DaNyel
相关产品推荐
相关产品推荐

