C语言实现输入空行后忽略后续所有字符与数字的问题
解决输入空行后忽略后续输入的问题
原代码无法检测空行的核心问题是:scanf("%f")会自动跳过所有空白字符(包括换行),因此无法识别空行;同时现有逻辑仅在遇到非数字输入时跳过当前行,但不会终止整个输入流程。以下是具体修改方案和代码:
修改要点
- 添加空行检测逻辑:改用
fgets读取整行输入,直接判断行内容是否仅含空白字符(空格、制表符、换行),以此识别空行。 - 新增停止输入标志:设置
stop_input变量,一旦检测到空行,立即终止后续所有输入处理。 - 逐行解析浮点数:用
strtof对非空行逐个解析浮点数,避免scanf跳过空白导致的空行无法检测问题。 - 整合错误处理:将非数字输入的错误检测融入逐行解析流程,保留原有的错误提示逻辑。
修改后的完整代码
#include <stdio.h> #include <stdlib.h> #include <ctype.h> // 判断字符串是否为空白行(仅含空格、制表符、换行) int is_blank_line(const char *line) { while (*line != '\0') { if (!isspace((unsigned char)*line)) { return 0; } line++; } return 1; } int main() { float pole[50]; int opakovania = 0; int zla_hodnota = 0; int zly_index = -1; int stop_input = 0; // 标记是否停止输入 char line[256]; char *ptr; while (opakovania < 50 && !stop_input) { // 读取整行输入 if (fgets(line, sizeof(line), stdin) == NULL) { // 遇到EOF if (zla_hodnota) { if (zly_index == 0) { printf("Nepodarilo sa nacitat zaklad x\n"); } else { printf("Nepodarilo sa nacitat polynom na %d mieste.\n", zly_index); } return 0; } else { break; } } // 判断是否为空行,是则停止输入 if (is_blank_line(line)) { stop_input = 1; break; } // 解析当前行中的所有浮点数 ptr = line; while (opakovania < 50 && *ptr != '\0') { float cislo; char *endptr; // 跳过前导空白 while (isspace((unsigned char)*ptr)) { ptr++; } if (*ptr == '\0') { break; } // 解析浮点数 cislo = strtof(ptr, &endptr); if (endptr == ptr) { // 解析失败,记录错误 zla_hodnota = 1; zly_index = opakovania; break; } else { // 解析成功,存入数组 pole[opakovania] = cislo; opakovania++; ptr = endptr; } } // 若已出现错误,终止输入 if (zla_hodnota) { break; } } if (opakovania == 0) { printf("Nepodarilo sa nacitat zaklad x.\n"); return 0; } // 霍纳法则计算多项式值 float vysledok = pole[1]; for (int i = 2; i < opakovania; ++i) { vysledok = vysledok * pole[0] + pole[i]; } printf("Vysledok je: %.2f\n", vysledok); return 0; }
关键修改说明
is_blank_line辅助函数:遍历字符串,判断是否仅含空白字符,精准识别空行。fgets读取整行:确保能捕获用户输入的空行(直接回车的情况),解决scanf跳过换行的问题。strtof解析浮点数:相比scanf,strtof能明确区分解析成功/失败的情况,同时允许逐字符控制解析位置,适配逐行处理逻辑。stop_input标志:一旦检测到空行,立即跳出输入循环,后续所有输入都会被忽略,符合需求。
内容的提问来源于stack exchange,提问作者misucik
相关产品推荐
相关产品推荐

