使用scanf动态获取数组元素后无法输出问题排查求助
使用scanf动态获取数组元素后无法输出问题排查求助
我来帮你梳理下代码里的问题,你的核心思路没问题,但几个细节导致程序没输出:
输入结束的触发方式不对:scanf返回
-1(也就是标准里的EOF)的前提是你输入了结束信号——Windows系统要按Ctrl+Z,Linux/macOS则是Ctrl+D。如果只是输入数字后按回车,程序会一直卡在循环里等待新的输入,根本走不到后面的printf代码。输出没有分隔符,容易被忽略:就算程序走到了输出步骤,你写的
printf("%d", arr[j]);会把所有数字连在一起输出(比如输入1、2、3会输出123),可能你误以为没输出。建议给每个数字加个空格或者换行,让输出更直观。隐藏的数组越界风险:你定义的
arr[1000]是固定大小的数组,如果输入超过1000个元素,会触发数组越界,这是未定义行为(可能崩溃或乱码),虽然不是当前没输出的原因,但必须注意。
我给你调整了代码,修复了这些问题:
#include <stdio.h> int main() { int arr[1000], input_num, count = 0; // 用1表示死循环,比89更易读;用EOF替代-1,语义更清晰 while (1) { // 读取输入,判断是否到达结束 if (scanf("%d", &input_num) == EOF) break; // 加入数组越界检查,避免程序崩溃 if (count >= 1000) { printf("警告:数组已满,无法再输入更多元素\n"); break; } arr[count] = input_num; count++; } // 输出每个元素,用空格分隔,最后加换行 for (int j = 0; j < count; j++) printf("%d ", arr[j]); printf("\n"); return 0; }
测试的时候,输入几个数字后按下对应的结束键,程序就会退出循环并输出所有输入的内容了。
如果你真的需要完全动态的数组(不局限于1000个元素),可以用malloc和realloc实现动态扩容,示例代码如下:
#include <stdio.h> #include <stdlib.h> int main() { int *arr = NULL; int input_num, count = 0, capacity = 0; while (scanf("%d", &input_num) != EOF) { // 当当前元素数量达到容量时,扩容(初始容量设为4,之后每次翻倍) if (count >= capacity) { capacity = (capacity == 0) ? 4 : capacity * 2; int *temp = realloc(arr, capacity * sizeof(int)); // 检查内存分配是否成功 if (!temp) { printf("错误:内存分配失败\n"); free(arr); return 1; } arr = temp; } arr[count++] = input_num; } // 输出元素 for (int j = 0; j < count; j++) printf("%d ", arr[j]); printf("\n"); // 记得释放动态分配的内存,避免内存泄漏 free(arr); return 0; }
备注:内容来源于stack exchange,提问作者JAISHREEDEVAKI T
相关产品推荐
相关产品推荐

