我正在努力创建自己的 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);
}
va_list(args);
va_list 是一种类型,而不是函数。您应该声明一个 va_list 类型的变量并与其他 va_* 事物一起使用。
Next up:
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
您实际上尚未提供 va_start 应该访问的任何参数。在这里调用 va_start 将导致未定义的行为。
如果你的第二个参数是 3,那么当你调用 sum_stdarg 时,两者都不会if
在 while 循环中曾经触发过,所以你的返回变量永远不会被分配,并且当你返回时仍然包含未初始化的内存。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)