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

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;
}

关键修改说明

  1. is_blank_line辅助函数:遍历字符串,判断是否仅含空白字符,精准识别空行。
  2. fgets读取整行:确保能捕获用户输入的空行(直接回车的情况),解决scanf跳过换行的问题。
  3. strtof解析浮点数:相比scanf,strtof能明确区分解析成功/失败的情况,同时允许逐字符控制解析位置,适配逐行处理逻辑。
  4. stop_input标志:一旦检测到空行,立即跳出输入循环,后续所有输入都会被忽略,符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 18:41:15