【问题标题】:Segmentation fault error in tail recursive function?尾递归函数中的分段错误错误?
【发布时间】:2019-11-16 11:29:05
【问题描述】:

我正在用 C 语言编写一个函数,用于将数字转换为不同的基数,例如八进制、二进制、十六进制等。我们需要递归地编写它,并且该函数必须返回一个 char *。但是,我在这段代码中遇到了分段错误错误。我也不确定转换是否正常工作,因为我无法克服这个错误。我是 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 结束

【问题讨论】:

  • return '0' 返回的是 char,而不是 char*。你应该得到一个编译器警告。
  • 我不明白你期望它如何工作。看起来您正在尝试使用 + 进行字符串连接,但这不是您在 C 中的操作方式。
  • return convertToBaseOut(num/base, base) + (num % base); 正在获取一个指针,为其添加偏移量,然后返回调整后的指针。换句话说,它根本不会像您希望它做的那样做任何事情。
  • 这看起来就像您使用了一个 Python 程序并简单地将其转换为 C 语法,而没有了解这两种语言之间的差异,尤其是关于它们如何处理字符串的差异。
  • 提示:当函数到达基本情况时,它应该为字符串malloc内存,然后每个级别的递归都需要将其数字附加到字符串。每个级别的递归,包括基本情况,都应该返回 malloc 返回的指针。

标签: c recursion segmentation-fault tail-recursion c89


【解决方案1】:

在 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;
}

它也会重新计算字符串的长度。

【讨论】:

  • 谢谢!有什么方法可以在不更改 char * 的返回类型的情况下做到这一点,因为我需要它来返回该类型。
猜你喜欢
  • 2014-11-05
  • 2013-03-05
  • 2017-12-25
  • 1970-01-01
  • 1970-01-01
  • 2020-05-01
  • 2021-06-18
相关资源
最近更新 更多