使用递归函数的长度字符数

时间:2013-11-13 19:12:36

标签: c++ recursion

我正在尝试创建一个可以计算字符串字符的递归函数,但我不知道为什么我的代码会崩溃我的系统。我没有更多的想法。 任何建议:

long slength (const char ntca[])
{
    int length = 0;

    if (ntca[length] == '\0'){
        return 0;
    }
    else{
        return  slength(ntca)+1;
    }
}

6 个答案:

答案 0 :(得分:6)

当前代码以递归方式为同一缓冲区调用slength。这将一直持续到堆栈溢出为止。

您需要将缓冲区减少一个字符,并为每个递归调用添加1到长度计数

return  slength(ntca+1)+1;
//                  ^^

答案 1 :(得分:1)

因为你没有缩短字符串而崩溃了。该行应为

return  slength(ntca+1)+1;

答案 2 :(得分:1)

您不需要声明局部变量。该函数可以写得更简单

size_t slength( const char s[] )
{
    return ( *s == '\0' ? 0 : 1 + slength( s + 1 ) );
}

答案 3 :(得分:0)

查看递归调用。如果ntca的长度不为零,则此函数将使用完全相同的参数调用自身。这会导致无休止的递归,从而导致堆栈崩溃。

在您在代码中尝试之前,您应该使用铅笔和纸张完成算法。

答案 4 :(得分:0)

通常,如果使用递归,则必须在较小的问题大小上进行递归调用。在您的代码中,您将函数调用到相同的数组(或者更确切地说,是指向数组中第一个元素的相同指针),而不是指向数组中下一个元素的指针。

但是,建议您不要在C ++中使用递归。此外,由于这是常见的事情,strlen()标题中定义了<cstring>。如果C ++标准库中已有一个已知的函数,请不要定义自己的函数。

答案 5 :(得分:0)

您必须减少递归中的答案大小。换句话说,尝试减小字符串(ntca)的大小以阻止无限递归。或者尝试添加一个参数来控制递归,如下所示:

long slength (const char ntca[], int n) //Look from n to the end of string for '\0'
{
    if (ntca[n] == '\0')
        return n; //the index of char '\0' indicates the length of string 
    else
        return  slength(ntca, n+1); //go, check the next char
}

所以你总是要按如下方式调用这个函数: x = slength(s,0)