好了,我试图让我的itoa_base.c返回一个字符串,我在另一个函数中创建了一个字符串*str,并将一个指向该字符串的引用指针发送到执行转换的函数,但是当我试图打印它进行检查时,我只得到了字符串的最后一个字符,而不是整个字符串,并且我不知道为什么。此外,itoa_base的功能与itoa完全相同,但可以选择转换基数。
#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);
}
发布于 2018-06-06 04:43:49
在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;
https://stackoverflow.com/questions/50708320
复制相似问题