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

scanf循环需输入两次'e'才终止的问题修复咨询

修复循环终止问题的方案

你的问题核心是scanf的格式要求导致输入'e'时必须补全后续整数,加上循环逻辑顺序不对,调整输入读取方式和循环结构就能解决:

修复后的代码

char letter;
int xPos, yPos;

// 先读取第一个字符,再判断是否终止
while (scanf(" %c", &letter) == 1) {
    // 遇到'e'直接跳出循环
    if (letter == 'e') {
        break;
    }
    // 读取后续的两个整数,验证输入有效性
    if (scanf("%i %i", &xPos, &yPos) != 2) {
        // 清除输入缓冲区里的错误内容,避免影响下一次读取
        while (getchar() != '\n');
        continue;
    }
    // 只有输入合法且不是'e'时,才更新网格
    grid[xPos][yPos] = 1;
}

为什么这样改?

  • 把字符读取和循环判断提前:单独读取第一个字符,输入'e'时不需要再输入整数,直接终止循环,解决了要输两次'e'的问题。
  • 拆分scanf的格式:避免原代码中输入'e'后,scanf还在等待两个整数的尴尬情况。
  • 检查scanf返回值:如果用户输入的整数不合法(比如输入字母),会清除缓冲区错误内容,防止后续读取混乱。

原代码的问题根源

原循环是先判断letter != 'e'(初始值大概率不是'e'),再执行scanf。当你输入'e'时,scanf因为格式要求还在等两个整数,所以你必须输入完或者再次输入'e'才能让scanf完成;而且就算输入了'e',这次循环还是会执行grid[xPos][yPos] = 1,直到下一次循环判断才退出,这就是需要两次输入'e'的原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 04:31:31