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

输入负整数后终止输入并找第二大数?C程序报错求助

问题描述

编写C程序,重复获取用户输入的非负整数;当输入负整数时,丢弃该值并立即终止输入,随后输出第二大数。

以下是我编写的代码:

int main (int argc, char **argv) {
    int counter, a[counter];
    for (int counter = 0; counter++;) {
        scanf("%d", &a[counter]);
        if (a[counter]<0) {
            break;
        }
    }
    max1 = max2 = INT_MIN;
    for (i=0; i<counter; i++;) {
       if (a[i]>max2 && a[i]<max1) {
           max2 = max1;
           max1 = arr[i];
       }
       else if (a[i]>max2 && a[i]<max1) {
           max2 = a[i];
    }
    
    printf(max2);
    
    return 0;
}

我的思路:用for循环实现输入逻辑,输入负数时终止;参考资料设置了max1 = max2 = INT_MIN,再用循环查找第二大数。但代码出现大量错误,不清楚问题所在,恳请帮助排查修正。


错误排查与修正方案

代码中的核心错误

  1. 数组定义非法
    int counter, a[counter];中counter未初始化就用作数组长度,C语言中变长数组要求长度是已知的非负整数,此处counter为随机值,会导致数组大小不确定甚至触发内存访问错误。另外固定数组无法适配未知数量的输入,容易溢出。

  2. 循环语法与作用域错误
    for (int counter = 0; counter++;) 的循环条件为空,且内部定义的counter与外部同名变量作用域冲突,会导致后续计数逻辑混乱。输入循环应持续读取值直到遇到负数。

  3. 变量未声明/拼写错误
    max1、max2、i均未声明类型;代码中误用arr[i],但实际数组名为a,属于变量名拼写错误。

  4. 第二大数逻辑完全错误
    两个分支的判断条件完全相同,且逻辑颠倒。正确逻辑应为:若当前数大于最大值,则第二大值替换为原最大值,最大值更新为当前数;若当前数小于最大值但大于第二大值,则更新第二大值。

  5. printf使用错误
    printf(max2);缺少格式控制符,应使用printf("%d\n", max2);,否则会导致未定义行为。

  6. 头文件缺失
    使用INT_MIN需要包含<limits.h>,使用scanf/printf需要包含<stdio.h>,缺失这些头文件会导致编译错误。


修正后的代码(两种方案)

方案一:边输入边计算(高效,无需存储所有输入)

#include <stdio.h>
#include <limits.h>

int main() {
    int num;
    int max1 = INT_MIN, max2 = INT_MIN;

    // 持续读取输入,直到遇到负数或输入失败
    while (scanf("%d", &num) == 1) {
        if (num < 0) {
            break;
        }

        // 更新最大和第二大值
        if (num > max1) {
            max2 = max1;
            max1 = num;
        } else if (num > max2 && num != max1) {
            // 避免重复最大值干扰第二大值判断
            max2 = num;
        }
    }

    // 处理输入不足两个数的边界情况
    if (max2 == INT_MIN) {
        printf("没有足够的非负整数输入\n");
    } else {
        printf("第二大数是:%d\n", max2);
    }

    return 0;
}

方案二:存储所有输入后计算(保留输入记录)

#include <stdio.h>
#include <limits.h>
#include <stdlib.h>

int main() {
    int *nums = NULL;
    int count = 0;
    int num;

    // 动态读取输入并分配内存
    while (scanf("%d", &num) == 1) {
        if (num < 0) {
            break;
        }
        // 重新分配内存,存储新输入的数
        int *temp = realloc(nums, (count + 1) * sizeof(int));
        if (temp == NULL) {
            printf("内存分配失败\n");
            free(nums);
            return 1;
        }
        nums = temp;
        nums[count++] = num;
    }

    // 处理输入不足两个数的情况
    if (count < 2) {
        printf("没有足够的非负整数输入\n");
        free(nums);
        return 0;
    }

    // 查找第二大数
    int max1 = INT_MIN, max2 = INT_MIN;
    for (int i = 0; i < count; i++) {
        if (nums[i] > max1) {
            max2 = max1;
            max1 = nums[i];
        } else if (nums[i] > max2 && nums[i] != max1) {
            max2 = nums[i];
        }
    }

    printf("第二大数是:%d\n", max2);
    free(nums); // 释放动态分配的内存
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 19:50:26