【问题标题】:Why that thing every time skip next element?为什么那个东西每次都跳过下一个元素?
【发布时间】:2022-11-20 19:18:55
【问题描述】:

您好,我想输出每个偶数的正元素。我使用 VA_LIST。编译器只统计1到4的数字,4到8不统计,请问是什么问题?

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

int MyPerfectF(int num, ...) {
    int sum = 0;
    va_list args;
    va_start(args, num);
    int x;
    while (va_arg(args, int) != NULL) {
        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 0;
}

int main(void) {
    int num = 5;
    int a, b, c, d;
    scanf_s("%d %d %d %d", &a, &b, &c, &d);
    MyPerfectF(num, a, b, c, d, NULL);
}

【问题讨论】:

  • 您在每次迭代中调用 va_arg 两次。

标签: c function variadic-functions


【解决方案1】:

来自va_arg[强调我的]:

T va_arg( va_list ap, T );

va_arg 宏扩展为表达式T型对应于下一个参数来自 va_list 应用程序。

MyPerfectF()函数中,

    while (va_arg(args, int) != NULL) {
        x = va_arg(args, int);

va_arg 被调用了两次,所以如果输入在偶数位置包含偶数,那么所有这些偶数都将被计算在内,否则它们不会被计算在内。

除此之外,您的代码中还有一个问题 - 在你的程序中,T型int。编译器必须对 while 循环条件的比较语句 (va_arg(args, int) != NULL) 发出警告。

您不需要通过 NULL 来指示参数的终止。相反,将 num 的值作为传递给 MyPerfectF() 函数的变量参数的数量传递,如下所示:

int main(void) {
    int num = 4;
    .....
    .....
    MyPerfectF(num, a, b, c, d);
}

并在MyPerfectF()中用这个替换while循环

for (int i = 0; i < num; ++i) {

另外,您可以将scanf()的返回值赋值给num并将其传递给MyPerfectF()函数,这将确保MyPerfectF()函数将只读取那些被scanf()成功读取并赋值的参数。把这些放在一起:

#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++;
        }
    }
    va_end(args);
    printf("
Amount of true numbers is: %d
", sum);
    return 0;
}

int main(void) {
    int a, b, c, d;
    printf ("Enter 4 values:
");
    int num = scanf("%d %d %d %d", &a, &b, &c, &d);
    MyPerfectF(num, a, b, c, d);
    return 0;
}

【讨论】:

    猜你喜欢
    • 2022-01-21
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多