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

如何根据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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:45:05