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
相关产品推荐
相关产品推荐

