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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 11:57:03