1

我正在使用 CodeLab for C++ 进行在线工作,但不确定我的代码有什么问题。这是问题:

编写一个递归的 int 值函数 len,它接受一个字符串并返回字符串中的字符数。字符串的长度为:如果字符串是空字符串 (""),则为 0。1 比第一个字符以外的其余字符串的长度多。

这是我的代码:

int len(string s)
{
  if (s.length()==0)
    return 0;
 else
 {
    return 1+(len(s)-1);
 }
}

它说我有一个运行时错误。有什么帮助吗?

谢谢。

4

4 回答 4

11

那么这里:

     return 1+(len(s)-1);

字符串的长度永远不会减少。所以你最终会有一个stackoverflow,因为你从来没有达到你的基本情况(s.length() == 0).你需要得到一个s的长度减少1的子字符串:

     return 1+(len(s.erase(0,1))); // erases 1 char from beginning then recurses

希望这纯粹是学术性的,因为std::string有一种length可以在恒定时间内运行的方法。(更不用说从字符串前面擦除可能非常低效 - 请参阅其他适用的答案char *

于 2012-12-07T21:55:25.887 回答
3

len(s) 永远不会减少并导致堆栈溢出。我会做类似的事情:

int len(const char * s) {
    if(*s == '\0')
        return 0;
    else
        return 1 + len(s+1); 
}
于 2012-12-07T21:59:13.830 回答
3

你永远不会修改s你的代码,所以如果s不是空的,你会继续调用相同的函数,并再次使用相同的参数;你永远不会停止。您的计算机堆栈空间不足,程序崩溃。

其他人给了你一些想法/选择。这是我的建议:

int len(const std::string &s, int start)
{
    /* If we are starting at the end, there's no more length */
    if(start == s.length())
        return 0;

    /* one plus whatever else... */
    return 1 + len(s, start + 1);
}

假设str是您想要获取长度的字符串,您可以将其称为:len(str, 0)

如果您需要使用某个const char *版本,请尝试以下操作:

int len(const char *s)
{
    if((s == NULL) || (*s == 0))
        return 0; /* we ran out of string! */

    return 1 + len(s + 1);
}
于 2012-12-07T22:04:12.517 回答
0

另一种解决方案:

int len(string s)
  {
  if (s.length()==0)
      return 0;
  else
     {
     s = s.substr(0, s.size()-1);
     return 1+(len(s));
     }
  }
于 2012-12-07T22:18:17.950 回答