C代码在Visual Studio运行报错-1073740791,请求问题排查
问题分析与修复方案
核心崩溃原因:Windows平台非法操作标准输入流
你的代码在Visual Studio中首次输入即崩溃,错误码-1073740791对应Windows系统错误码0xC0000409(栈缓冲区溢出/非法内存访问),根源出在getInput函数中的这一行:
fseek(stdin,0,SEEK_END); //clears any leftover crap in stdin
Windows系统中,标准输入流(stdin)属于交互式文本流,不支持fseek操作,强行调用会触发未定义行为,直接导致程序崩溃。这也是代码在Linux/macOS环境编译器(包括在线编译器、VS Code使用的GCC)中能正常运行,但在Visual Studio中崩溃的原因——不同平台对标准流的处理规则存在差异。
具体修复方案
1. 替换非法的缓冲区清空方式
删除fseek(stdin,0,SEEK_END),改用跨平台且合法的方式清空输入缓冲区:
// 清空输入缓冲区直到换行符或EOF int c; while ((c = getchar()) != '\n' && c != EOF);
将这段代码放在需要清空缓冲区的位置(比如处理错误输入后)。
2. 修正scanf参数错误
scanf("%255s", &inputStorage)写法错误,数组名inputStorage会隐式转换成指针,应改为:
if(scanf("%255s", inputStorage) != 1)
3. 修正字符转义错误
代码中多处将字符串结束符写成'\\0',C语言中正确的转义应为'\0'(单个反斜杠),例如:
// 错误写法 if(checker != '\\0' && checker != '\\n' && checker != EOF) // 正确写法 if(checker != '\0' && checker != '\n' && checker != EOF)
同时循环条件inputStorage[qer] != '\\0'也要改为inputStorage[qer] != '\0'。
4. 优化输入处理逻辑
- 初始化未赋值变量:
int intCaster = 0;,避免编译器警告; - 用
atoi替代atof+强制类型转换,更直接处理整数输入:intCaster = atoi(inputStorage);。
修复后的getInput函数示例
int getInput(int row, int column){ char inputStorage[256]; int intCaster = 0; int i = 1; while (i == 1){ i++; printf("Input row %d column %d: ", row, column); if(scanf("%255s", inputStorage) != 1){ printf("Entry Error.\n"); // 清空缓冲区 int c; while ((c = getchar()) != '\n' && c != EOF); i = 1; continue; } int checker = getchar(); if(checker != '\n' && checker != EOF){ printf("Entry Error. Too many inputs.\n"); // 清空缓冲区 int c; while ((c = getchar()) != '\n' && c != EOF); i = 1; continue; } int valid = 1; for(int qer = 0; inputStorage[qer] != '\0'; qer++){ if(isdigit(inputStorage[qer]) == 0){ printf("Entry Error. Junk Data.\n"); valid = 0; break; } } if(valid){ intCaster = atoi(inputStorage); i = 0; } else { i = 1; } } return intCaster; }
修改上述问题后,代码可在Visual Studio中正常运行,同时保持在其他编译器中的兼容性。
内容的提问来源于stack exchange,提问作者user23655420
相关产品推荐
相关产品推荐

