我正在尝试创建一个可以计算字符串字符的递归函数,但我不知道为什么我的代码会使我的系统崩溃。我没有更多的想法了。有什么建议么:
long slength (const char ntca[])
{
int length = 0;
if (ntca[length] == '\0'){
return 0;
}
else{
return slength(ntca)+1;
}
}
当前代码slength
递归调用相同的缓冲区。这将一直持续到堆栈溢出。
您需要将缓冲区减少一个字符,并将每个递归调用的长度计数加 1
return slength(ntca+1)+1;
// ^^
它崩溃了,因为你没有缩短字符串。该行应为
return slength(ntca+1)+1;
您不需要声明局部变量。函数可以写得更简单
size_t slength( const char s[] )
{
return ( *s == '\0' ? 0 : 1 + slength( s + 1 ) );
}
查看递归调用。如果 的长度ntca
不为零,则此函数使用完全相同的参数调用自身。这会导致无休止的递归,从而使堆栈崩溃。
在用代码尝试之前,你应该用铅笔和纸完成你的算法。
通常,如果使用递归,则必须对较小的问题规模进行递归调用。在您的代码中,您将函数调用到同一个数组(或者更确切地说,是指向数组中第一个元素的相同指针),而不是指向数组中下一个元素的指针。
但是,建议您不要在 C++ 中使用递归。另外,由于这是很常见的事情,因此在标题strlen()
中定义了一个。<cstring>
如果 C++ 标准库中已经有一个已知函数,请不要定义自己的函数。
您必须减少递归中的答案大小。换句话说,尝试减小字符串 (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)