C语言for循环中使用scanf_s读取字符运行结果不符合预期
C语言字符统计程序异常排查
问题1:设定15次的for循环仅输入8次就终止的原因
scanf_s使用%c格式符读取字符时不会自动跳过输入缓冲区中的空白字符,你每次输入字符后按下的回车会被识别为\n换行符,同样会被%c读取。每一次手动输入操作实际对应2次scanf_s读取:第一次读你输入的X/1/2,第二次读回车产生的换行符。15次循环总共要读取15个字符,对应你手动输入8次(前7次输入占14次读取,第15次读取第8次输入的第一个字符后循环达到终止条件退出),所以看起来仅输入8次就跳出了循环。
问题2:统计结果恒为15的诱因
你在if (score == 'X')语句末尾额外书写了一个英文分号;,这个分号会被识别为if判断的执行体,也就是说不管判断结果是否成立,都只会执行空操作。后续包裹d++的大括号代码块和if判断完全无关,每轮循环都会无条件执行d++,15次循环后变量d的结果自然恒为15。
修复后的可运行代码
#include <stdio.h> #define TOTOSIZE 15 int main() { int d = 0, i; char score; for (i = 1; i <= TOTOSIZE; i++) { // 格式符前加空格,自动跳过所有前置空白字符(换行、空格等) scanf_s(" %c", &score); // 删除if末尾多余的分号,让d++成为if判断的执行逻辑 if (score == 'X') { d++; } } printf("%d", d); return 0; }
内容的提问来源于stack exchange,提问作者adirk1
相关产品推荐
相关产品推荐

