如何在C语言中接收未知大小的整数数组及后续两个整数输入
C语言实现不定长整数数组加后续两个整数的输入
问题说明
需要接收一组数量不确定的整数作为数组,之后再接收两个单独的整数,输入示例如下:
4 5 6 7 8
20
15
用户给出的代码尝试存在问题,先看原代码:
int a[1001],x,y; int i=0; while(scanf("%d ",&a[i])==1){ i++ } scanf("%d\n%d",&x,&y);
原代码的问题
scanf("%d ",&a[i])中的空格会让scanf持续读取,直到遇到非空白字符才结束循环,无法正确识别数组输入的结束i++末尾缺少分号,属于语法错误scanf("%d\n%d",&x,&y)中的\n会让scanf忽略所有空白(包括换行),直到读取到第二个整数,不符合输入格式预期
两种可行实现方法
方法一:动态数组(无容量限制)
这种方式可根据输入数量动态调整数组大小,灵活性更高:
#include <stdio.h> #include <stdlib.h> int main() { int *arr = NULL; int capacity = 0; int count = 0; int num, x, y; // 读取数组元素 while (scanf("%d", &num) == 1) { // 内存不足时扩容,初始容量设为4,之后每次翻倍 if (count >= capacity) { int new_capacity = (capacity == 0) ? 4 : capacity * 2; int *new_arr = realloc(arr, new_capacity * sizeof(int)); if (new_arr == NULL) { perror("内存分配失败"); free(arr); return 1; } arr = new_arr; capacity = new_capacity; } arr[count++] = num; // 检测输入流是否到换行(判断数组行输入结束) char c; scanf("%c", &c); if (c == '\n') { break; } ungetc(c, stdin); // 把非换行字符放回输入流 } // 读取后续两个整数 if (scanf("%d%d", &x, &y) != 2) { printf("读取后续整数失败\n"); free(arr); return 1; } // 测试输出 printf("数组元素:"); for (int i = 0; i < count; i++) { printf("%d ", arr[i]); } printf("\n后续两个整数:%d %d\n", x, y); free(arr); // 释放动态分配的内存 return 0; }
方法二:固定大小数组(简单有上限)
如果可以接受数组有最大容量限制,修正原代码即可:
#include <stdio.h> int main() { int a[1001], x, y; int i = 0; // 读取数组元素,限制最大容量避免越界 while (i < 1000 && scanf("%d", &a[i]) == 1) { char c; scanf("%c", &c); // 遇到换行说明数组行输入结束 if (c == '\n') { break; } ungetc(c, stdin); i++; } // 读取后续两个整数,格式串不需要加换行 scanf("%d%d", &x, &y); // 测试输出 printf("数组元素:"); for (int j = 0; j <= i; j++) { printf("%d ", a[j]); } printf("\n后续两个整数:%d %d\n", x, y); return 0; }
注意事项
- 使用
scanf时,格式串里的空白字符会匹配输入中任意数量的空白,不要随意添加多余的空格或换行,否则会导致输入判断异常 - 动态数组方式必须调用
free释放内存,避免内存泄漏 - 手动输入时,输入完数组行后按换行,再输入两个整数即可;文件输入时,数组为一行整数,之后两行各一个整数也能正确处理
内容的提问来源于stack exchange,提问作者Sakthi Manikandan
相关产品推荐
相关产品推荐

