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

Rush Hour游戏SelectCar函数scanf跳过及段错误问题求助

问题分析与解决

问题1:scanf跳过输入

第一次调用SelectCar时,scanf("%c", &car)会读取输入缓冲区中残留的换行符(比如之前用户输入停车场尺寸后按下的回车),导致car被赋值为'\n',而这个字符显然不在停车场中,触发递归调用。

问题2:段错误(栈溢出)

递归调用SelectCar会不断占用栈空间,即使仅递归两次就崩溃,大概率是因为递归加上缓冲区问题导致的栈帧堆积,或重复输入操作引发的内存异常。递归在这里不是合适的实现方式,循环更安全。

修复后的代码

#include <stdbool.h>
#include <stdio.h>

// 假设MAX_LOT_LENGTH已提前定义
#define MAX_LOT_LENGTH 6

char SelectCar(char lot[MAX_LOT_LENGTH][MAX_LOT_LENGTH], int Length) {
    char car;
    bool exists;
    do {
        exists = false;
        printf("Enter the car you want to move:\n");
        // 用空格跳过所有空白字符(换行、空格等),确保读取有效字符
        scanf(" %c", &car);
        
        // 检查车辆是否存在
        for (int i = 0; i < Length; i++) {
            for (int j = 0; j < Length; j++) {
                if (lot[i][j] == car) {
                    exists = true;
                    // 找到后直接跳出循环,无需继续遍历
                    goto end_search;
                }
            }
        }
    end_search:
        if (!exists) {
            printf("Invalid car id! enter again:\n");
        }
    } while (!exists); // 循环直到输入有效车辆
    
    printf("car selected\n");
    return car;
}

关键修复点

  • 解决缓冲区问题:将scanf("%c", &car)改为scanf(" %c", &car),前面的空格会自动跳过所有空白字符(包括换行、空格、制表符),确保读取到用户输入的有效车辆字符。
  • 替换递归为循环:用do-while循环替代递归,避免栈溢出风险,同时逻辑更清晰,易于调试。
  • 优化查找逻辑:找到目标车辆后立即跳出嵌套循环,减少不必要的遍历。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 07:01:21