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

使用VA_LIST筛选正偶数时出现跳元素、统计不全的问题排查

问题分析与修复方案

核心问题

  • 重复读取可变参数导致跳过元素:while条件中调用va_arg(args, int)取出一个参数,但未对其做任何处理就丢弃;紧接着循环体内又调用va_arg取下一个参数,相当于每次循环跳过第一个取出的元素,只处理第二个,最终表现为跳过元素。
  • 终止符类型不匹配引发未定义行为:NULL是指针类型常量,而可变参数均为int类型,用va_arg(args, int)读取指针类型值属于类型不匹配,会触发未定义行为,导致参数读取异常(比如无法正确读取后续参数)。
  • 参数个数变量未生效:传入的num参数未被函数使用,无法起到限制参数个数的作用,属于冗余代码。

修复后的代码

#include <stdio.h>
#include <stdarg.h>

int MyPerfectF(int num, ...) {
    int sum = 0;
    va_list args;
    va_start(args, num);
    int x;
    // 单次读取参数并判断终止符,避免重复读取
    while ((x = va_arg(args, int)) != -1) {
        if (x > 0 && x % 2 == 0) {
            printf("%d ", x);
            sum++;
        }
    }
    printf("\nAmount of true numbers is: %d", sum);
    va_end(args);
    return sum;
}

int main(void) {
    int a, b, c, d;
    scanf_s("%d %d %d %d", &a, &b, &c, &d);
    // 使用int类型的-1作为终止符,匹配参数类型
    MyPerfectF(4, a, b, c, d, -1);
    return 0;
}

可选优化:基于参数个数遍历

如果希望通过num指定参数个数,无需终止符,可修改为以下实现:

#include <stdio.h>
#include <stdarg.h>

int MyPerfectF(int num, ...) {
    int sum = 0;
    va_list args;
    va_start(args, num);
    // 按传入的参数个数遍历,无需终止符
    for (int i = 0; i < num; i++) {
        int x = va_arg(args, int);
        if (x > 0 && x % 2 == 0) {
            printf("%d ", x);
            sum++;
        }
    }
    printf("\nAmount of true numbers is: %d", sum);
    va_end(args);
    return sum;
}

int main(void) {
    int a, b, c, d;
    scanf_s("%d %d %d %d", &a, &b, &c, &d);
    // 传入实际参数个数4,无需终止符
    MyPerfectF(4, a, b, c, d);
    return 0;
}

内容的提问来源于stack exchange,提问作者KonstantaV

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:15:54