如何根据scanf输入整数数量设置数组长度并过滤指定范围数值
C语言动态数组实现输入校验与统计解决方案
原有代码问题汇总
- 未对输入值做前置校验就直接存入数组,且检测到超范围值直接终止程序,不符合保留有效值的需求
- 每次输入新值后全量遍历数组做范围校验,逻辑冗余性能低下
printArray函数存在数组越界访问、max/min值重复初始化、平均值计算错误、超范围提示逻辑仅判断首个元素等问题- 未实现无效值过滤逻辑,数组中会残留超范围的无效数据
修改后完整可运行代码
#include <stdio.h> #include <stdlib.h> #include <limits.h> #define INITIAL_SIZE 10 #define MIN_VAL -10000 #define MAX_VAL 10000 void printResult(const int *validArray, size_t validCount, int hasInvalid) { if (validCount == 0 && !hasInvalid) { printf("未输入有效整数\n"); return; } // 输出有效数字 for (size_t i = 0; i < validCount; i++) { if (i > 0) printf(", "); printf("%d", validArray[i]); } // 有无效值输出错误提示 if (hasInvalid) { printf("\nError: Input is outside interval!"); } if (validCount == 0) { printf("\n"); return; } // 统计各项指标 int positive = 0, negative = 0, even = 0, odd = 0, sum = 0; int max = INT_MIN, min = INT_MAX; for (size_t i = 0; i < validCount; i++) { int num = validArray[i]; sum += num; if (num > 0) positive++; else if (num < 0) negative++; if (num % 2 == 0) even++; else odd++; if (num > max) max = num; if (num < min) min = num; } // 输出统计结果 printf("\nNumbers: %d", validCount); printf("\nPositive: %d", positive); printf("\nNegative: %d", negative); printf("\nEven: %d", even); printf("\nOdd: %d", odd); printf("\nPositive percentage: %.2f%%", (float)positive / validCount * 100); printf("\nNegative percentage: %.2f%%", (float)negative / validCount * 100); printf("\nEven percentage: %.2f%%", (float)even / validCount * 100); printf("\nOdd percentage: %.2f%%", (float)odd / validCount * 100); printf("\nAverage: %.2f", (float)sum / validCount); printf("\nMaximum: %d", max); printf("\nMinimum: %d\n", min); } int main() { size_t arraySize = INITIAL_SIZE; size_t validCount = 0; int hasInvalid = 0; int *myArray = malloc(sizeof(*myArray) * arraySize); if (myArray == NULL) { fprintf(stderr, "内存分配失败\n"); exit(-1); } int curEntry; // 循环读取输入直到换行 while (scanf("%d", &curEntry) == 1) { // 前置校验输入范围 if (curEntry < MIN_VAL || curEntry > MAX_VAL) { hasInvalid = 1; // 吃掉数字后的字符,判断是不是换行 char ch = fgetc(stdin); if (ch == '\n') break; ungetc(ch, stdin); continue; } // 有效值存入数组 myArray[validCount++] = curEntry; // 数组扩容逻辑 if (validCount == arraySize) { arraySize += INITIAL_SIZE; int *temp = realloc(myArray, sizeof(*temp) * arraySize); if (temp == NULL) { fprintf(stderr, "内存扩容失败\n"); free(myArray); exit(-1); } myArray = temp; } // 判断是否到输入末尾 char ch = fgetc(stdin); if (ch == '\n') break; ungetc(ch, stdin); } // 输出结果 printResult(myArray, validCount, hasInvalid); free(myArray); return 0; }
核心修改点说明
- 新增输入前置校验逻辑:读取到数值后先判断范围,超范围仅标记错误标识后跳过,不终止程序
- 仅将有效值存入数组,避免后续无效值过滤操作,数组中存储的全是合法数据
- 重构打印统计函数,修复原有数组越界、统计值初始化错误、计算逻辑错误等问题
- 优化输入读取逻辑,正确处理数字后的分隔符,避免换行判断错误
- 新增边界场景兼容:全为无效值、无输入值等场景均可以正常输出结果
内容的提问来源于stack exchange,提问作者SajLencV02
相关产品推荐
相关产品推荐

