如何正确使用va_list,add,start,end?

时间:2019-04-06 16:40:28

标签: c

我正在努力创建自己的printf函数。我从完成主要项目所需的较小功能开始。

如果i = 0,则我的函数应返回参数的总和;如果i = 1,则应返回作为参数传递的最后nb个字符串的大小之和。 因此,如果我有:./a.out 0 2 3 3,则应返回6。 但是,我得到的只是1,如果第二个参数是3,那么我得到的是一个怪异的负数。

有人可以帮助我解决这个问题,或者至少将我指出正确的方向吗? 预先谢谢你!

我尝试使用vprintf,但我不知道如何正确使用它。顺便说一句,我现在使用printf的唯一原因是进行测试。完成后,我将进行单元测试。

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

int my_getnbr(char const *str);

int sum_stdarg(int i, int nb, ... )
{
    int j = 0;
    int signal = 0;
    va_list(args);

    va_start(args, nb);
    while (nb > j) {
        if(i == 0) {
        signal = signal + va_arg(args, int);
    }
        else if (i == 1) {
        signal = signal + strlen(va_arg(args, char*));
    }
    j++;
    }
    va_end(args);
    return (signal);
}

int my_getnbr(char const *str)
{
    int i = 0;
    long cpy = 0;
    int intcpy;

    while ((str[i] < '0' || str[i] > '9') && str[i] != '\0')
        i++;
    if (str[i - 1] == '-') {
        while ((str[i] >= '0' && str[i] <= '9') && str[i] != '\0') {
            cpy = cpy * 10 - (str[i] - 48);
            i++;
        }
    } else {
        while ((str[i] >= '0' && str[i] <= '9') && str[i] != '\0') {
            cpy = cpy * 10 + (str[i] - 48);
            i++;
        }
    }
    if (cpy < -2147483648 || cpy > 2147483647)
        return (0);
    intcpy = cpy;
    return (intcpy);
}

int main(int ac, char **av)
{
    printf("%d\n", sum_stdarg(my_getnbr(av[1]), my_getnbr(av[2])));
    return (0);
}

1 个答案:

答案 0 :(得分:1)

Col-3

va_list是类型,而不是函数。您应该声明一个va_list类型的变量,并与其他va_ *一起使用。

下一步:

va_list(args);

您实际上并未提供va_start应该访问的任何参数。在此处调用va_start将导致未定义的行为。

如果第二个arg为3,则在调用sum_stdarg时,while循环中的int sum_stdarg(int i, int nb, ... ) // '...' declared as third parameter [...] printf("%d\n", sum_stdarg( my_getnbr(av[1]), my_getnbr(av[2]))); // 'sum_stdarg' called with 2 arguments 均不会触发,因此返回变量将永远不会赋值给您,并且返回时仍包含未初始化的内存。