我正在尝试复制printf因为我不允许在作业中使用真正的作品,而且当我传递的值太大时我不明白发生了什么:
unsigned int n = 4294967286;
printf("%o", n); #=> 37777777766
my_printf("%o", n); #=> 4256507006;
我得到了这样的价值:
a = (unsigned int)(va_arg(f->l, unsigned int));
然后我使用我的ui_to_s
来获取相应的字符串:
char *ui_to_s_base(unsigned long long n, int base, const char *base_set)
{
const char *defaut_base = "0123456789abcdef";
char *res;
char *tmp;
unsigned long long i;
tmp = str_new_size(256);
i = 0;
tmp[i++] = base_set ? base_set[(n % base)] : defaut_base[(n % base)];
while ((n /= 10) > 0)
tmp[i++] = base_set ? base_set[(n % base)] : defaut_base[(n % base)];
tmp[i] = '\0';
res = str_reverse(tmp);
free(tmp);
return (res);
}
我做错了吗?
答案 0 :(得分:2)
while ((n /= 10) > 0)
你应该除以base
。只要您要求它以十进制打印,10就会像魅力一样工作。
我想这里的故事的寓意是,如果你的某些代码中有一个包含非平凡常数的错误,那么这可能是开始调查的好地方。