C语言 为什么那东西每次都跳过下一个元素?

g6ll5ycj  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(113)

你好,我想输出每一个偶数的正数元素。我使用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);
}
q8l4jmvw

q8l4jmvw1#

va_arg[强调我的]
(1)将数据库中的数据保存到数据库中;
va_arg宏扩展为类型T的表达式,该表达式对应于va_list ap中的next参数
MyPerfectF()函数中,

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

va_arg被调用两次,因此如果输入在偶数位置包含偶数,则所有这些偶数都将被计数,否则它们不被计数。
除此之外,您的代码中还有一个问题-在您的程序上下文中,类型Tint。编译器必须在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("\nAmount of true numbers is: %d\n", sum);
    return 0;
}

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

相关问题