C语言:调用scanf后矩阵输入的数值范围检查异常问题
问题定位
核心原因是scanf读取数值后,输入缓冲区中残留的换行符被后续矩阵输入的读取逻辑当成了空输入行,解析失败后得到非法垃圾值,触发了0-1000的范围检查错误。
解决方案
1. 清理输入缓冲区残留字符
在getSomeNumber函数结束前,添加代码清空缓冲区中剩余的所有字符(直到遇到换行或EOF),避免干扰后续输入:
void getSomeNumber(int *num) { printf("输入一个数字:"); scanf("%d", num); // 清理缓冲区残留的换行符及其他字符 int c; while ((c = getchar()) != '\n' && c != EOF); }
2. 优化矩阵输入的错误处理逻辑
读取矩阵行时,先判断是否为空输入,避免直接解析空内容触发错误:
// 示例矩阵输入处理代码 int matrix[3][2]; char line[100]; for (int i = 0; i < 3; i++) { printf("输入第%d行(格式如3,4):", i+1); if (fgets(line, sizeof(line), stdin) == NULL) { break; // 处理输入异常 } // 去除行尾换行符 size_t len = strlen(line); if (len > 0 && line[len-1] == '\n') { line[len-1] = '\0'; } // 检查空输入 if (strlen(line) == 0) { printf("输入不能为空,请重新输入\n"); i--; // 重新循环当前行 continue; } // 解析逗号分隔的两个数值 int a, b; if (sscanf(line, "%d,%d", &a, &b) != 2) { printf("格式错误,请按「数字,数字」格式输入\n"); i--; continue; } // 数值范围检查 if (a < 0 || a > 1000 || b < 0 || b > 1000) { printf("数值需在0-1000之间,请重新输入\n"); i--; continue; } // 存入矩阵 matrix[i][0] = a; matrix[i][1] = b; }
3. 统一输入处理方式(可选)
如果倾向于全程使用scanf,需同步处理分隔符和缓冲区残留:
int matrix[3][2]; for (int i = 0; i < 3; i++) { printf("输入第%d行(格式如3,4):", i+1); int a, b; int ret = scanf("%d,%d", &a, &b); // 清理缓冲区 int c; while ((c = getchar()) != '\n' && c != EOF); if (ret != 2) { printf("格式错误,请重新输入\n"); i--; continue; } if (a < 0 || a > 1000 || b < 0 || b > 1000) { printf("数值需在0-1000之间,请重新输入\n"); i--; continue; } matrix[i][0] = a; matrix[i][1] = b; }
内容的提问来源于stack exchange,提问作者3nondatur
相关产品推荐
相关产品推荐

