输入负整数后终止输入并找第二大数?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,再用循环查找第二大数。但代码出现大量错误,不清楚问题所在,恳请帮助排查修正。
代码中的核心错误
数组定义非法
int counter, a[counter];中counter未初始化就用作数组长度,C语言中变长数组要求长度是已知的非负整数,此处counter为随机值,会导致数组大小不确定甚至触发内存访问错误。另外固定数组无法适配未知数量的输入,容易溢出。循环语法与作用域错误
for (int counter = 0; counter++;)的循环条件为空,且内部定义的counter与外部同名变量作用域冲突,会导致后续计数逻辑混乱。输入循环应持续读取值直到遇到负数。变量未声明/拼写错误
max1、max2、i均未声明类型;代码中误用arr[i],但实际数组名为a,属于变量名拼写错误。第二大数逻辑完全错误
两个分支的判断条件完全相同,且逻辑颠倒。正确逻辑应为:若当前数大于最大值,则第二大值替换为原最大值,最大值更新为当前数;若当前数小于最大值但大于第二大值,则更新第二大值。printf使用错误
printf(max2);缺少格式控制符,应使用printf("%d\n", max2);,否则会导致未定义行为。头文件缺失
使用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

