itoa实现返回不完整的字符串

时间:2018-06-05 20:19:22

标签: c

好的,所以我试图让我的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);
}

1 个答案:

答案 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;