Ошибка ошибки сегментации в хвостовой рекурсивной функции? - PullRequest
0 голосов
/ 06 июля 2019

Я пишу функцию в C, которая преобразует число в другое основание, такое как восьмеричное, двоичное, шестнадцатеричное и т. Д. Мы должны написать это рекурсивно, и функция должна возвращать символ *. Тем не менее я получаю сообщение об ошибке сегментации на этот фрагмент кода. Я также не уверен, что преобразование работает правильно, потому что я не могу обойти эту ошибку. Я новичок в C, поэтому я прошу прощения, если есть что-то, что мне явно не хватает.

#include <stdio.h>

char *convertToBaseOut(short int num, int base);

int main()
{
    printf("%s", convertToBaseOut(256, 8));
    return 0;
}

char *convertToBaseOut(short int num, int base) {
    if (num == 0) {
        return '0';
    }
    return convertToBaseOut(num/base, base) + (num % base);
}

Ошибка сегментации

... Программа завершена с кодом выхода 139

1 Ответ

2 голосов
/ 06 июля 2019

В C вы не можете использовать + для объединения строк.

Здесь у вас есть простая рекурсивная функция:

size_t tostring(char *str, unsigned num, unsigned base)
{
    static const char digits[] = "0123456789ABCDEF";

    size_t pos;
    if(!num)
    {
        return 0;
    }
    else
    {
        pos = tostring(str, num / base, base);
        str[pos++] = digits[num % base];
        str[pos] = 0;
    }
    return pos;
}

int main()
{

    char str[20];
    printf("%u\n" , tostring(str,0xabcd, 2));
    printf("%s\n", str);

    return 0;
}

Она также изменяет длину строки.

...