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

C语言求输入整数序列最值程序输出异常求助

问题分析与修复

核心错误点

  • 输入逻辑错误:你的代码每次循环先读取一个整数,接着读取一个字符串判断是否结束。但示例输入中,第二个整数2会被scanf("%4s", line)读取,而非存入val参与最值计算,导致这个数被忽略,最终最小值停留在5,最大值为9。
  • 初始值设置不合理:min = 10和max = -1是硬编码的固定值,如果输入的所有数都大于10,最小值会错误保留10;如果所有数都小于-1,最大值会错误保留-1。

修复后的代码

#include <stdio.h>
#include <string.h>
#include <limits.h>  // 用于INT_MAX和INT_MIN

int main() {
    char line[1000];
    int val, min, max;
    int first_input = 1;  // 标记是否为第一个有效输入的整数

    while (1) {
        // 先读取每行内容到字符串,优先判断是否结束
        if (scanf("%999s", line) != 1) {
            break;  // 输入出错时退出循环
        }
        if (strcmp("done", line) == 0) {
            break;
        }
        // 将字符串转为整数,校验输入有效性
        if (sscanf(line, "%d", &val) != 1) {
            printf("无效输入,请输入整数或done\n");
            continue;
        }
        // 用第一个有效整数初始化最值
        if (first_input) {
            min = val;
            max = val;
            first_input = 0;
        } else {
            if (val < min) min = val;
            if (val > max) max = val;
        }
    }

    // 确保有有效输入才输出结果
    if (!first_input) {
        printf("Maximum %d\n", max);
        printf("Minimum %d\n", min);
    } else {
        printf("没有输入任何整数\n");
    }

    return 0;
}

修复说明

  1. 调整输入逻辑:先读取每行内容到字符串,先判断是否是done,非结束指令再转为整数处理,确保每个输入的整数都能参与最值计算。
  2. 动态初始化最值:用标记位判断第一个有效整数,将min和max初始化为该值,避免硬编码初始值带来的边界错误。
  3. 增加输入校验:判断字符串转整数是否成功,处理非整数的无效输入,同时判断是否有有效输入,避免无整数时输出错误结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 06:45:45