#include <stdio.h>
#include <stdlib.h>
void ft_itoa_base_sneaky(int value, int base, char *str)
{
char *ref = "0123456789ABCDEF";
if (value < base)
{
*str = ref[value];
printf("%s", str);
str++;
}
else if (value >= base)
{
printf("%d\n", value);
ft_itoa_base_sneaky(value / base, base, str);
ft_itoa_base_sneaky(value % base, base, str);
}
}
char *ft_itoa_base(int value, int base)
{
char *str;
char *tmp;
str = malloc(sizeof(char) * 32);
tmp = str;
ft_itoa_base_sneaky(value, base, tmp);
printf("\n%s", tmp);
return (str);
}
int main (int ac, char **av)
{
char *str;
if (ac == 3)
str = ft_itoa_base(atoi(av[1]), atoi(av[2]));
printf("\n");
printf("%s\n", str);
return (0);
}
答案 0 :(得分:3)
在ft_itoa_base_sneaky
中,您会增加str
,但之后您不会对其执行任何操作。由于str
是一个局部变量,对它的更改不会反映在调用函数中。双递归也没有必要。
由于递归以相反的顺序处理数字,所以让基本情况(处理最高有效数字)将索引0写入字符串并更改函数以返回它处理的索引。然后在递归的情况下写入返回的索引加1。
int ft_itoa_base_sneaky(int value, int base, char *str)
{
char *ref = "0123456789ABCDEF";
if (value < 0) {
int idx = ft_itoa_base_sneaky((-value) / base, base, str) + 1;
str[idx] = '-';
return idx;
} else if (value < base) {
str[0] = ref[value];
return 0;
} else {
int idx = ft_itoa_base_sneaky(value / base, base, str) + 1;
str[idx] = ref[value%base];
return idx;
}
}
然后调用函数可以使用此索引来设置空终止符:
int idx = ft_itoa_base_sneaky(value, base, tmp) + 1;
tmp[idx] = 0;