使用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
相关产品推荐
相关产品推荐

