字符串递归函数错误中的字符串

时间:2014-11-10 06:44:48

标签: c++ recursion

我正在尝试写一个递归函数的问题。该函数的目的是在字符串中查找字符串,然后使用递归返回第一个字符串位于第一个字符串内的索引。

我能够做到这一点。第二个字符串未包含在第一个字符串中时出现问题。我想向用户说明找不到第二个字符串。我不能让它传达这个信息。

int index_of(string s, string t){
  int len1 = s.length(), len2 = t.length(), index = 0;
  if (len1==len2){
     if (s.substr(index, len2) == t){
       return index;
     }else{
       return -1;
     }
  else{
    index++;
    return index_of(s.substr(index, len1),t)+index;
  }
}

int main(){ 
  string strOne = "", strTwo = "";
  cout << "This program will find the ocurrence of one string within        another.\n\nEnter the string to be searched:\t";
  getline(cin, strOne);
  cout << "\nNow enter the string you want to search for:\t";
  getline(cin, strTwo);
  int index = index_of(strOne, strTwo);
  if (index == -1){
    cout << "\nThe second string cannot be found. Sorry!\n\n";}
  else{
    cout << "\nThe index of the substring is:\t" << index << "\n\n";
  }
  system("PAUSE");
  return 0;
}

任何帮助将不胜感激! :)

2 个答案:

答案 0 :(得分:0)

如果第一个字符串不包含第二个字符串,则index无限增加,使string s长度为零。所以你必须检查第一个字符串是否短于第二个字符串。如果是这样,它不包含子字符串。

  if (len1 < len2){
    // first string doesn't contain the second
    return -2;
  }else if (len1==len2){
    ...

但你根本不应该使用递归函数。 find中还有一个内置函数string: 请检查此问题:Check if a string contains a string in C++

答案 1 :(得分:0)

首先,您发布的代码中存在许多问题 和formost,它不会编译,因为你没有定义 index中的index_of。当然,你只做了 比较两个字符串的长度是否相同。但它是 很难弄清楚你想要的比较是什么 do,因为您根据未定义的变量获取子字符串 index;如果index0,那么就没有意义 子串,如果index不是0,那么 s.substr( index, len2 ) == t永远不会是真的(因为你只是 如果st的长度相同,请输入此分支。

你真正需要做的是从简单的英语定义什么 该功能应该:

  • 如果s短于t,则无法匹配,所以您 返回-1。

  • 否则,如果s的开头等于t,则返回 当前指数。

  • 否则,你递归s的子字符串,删除 第一个字符(并递增index)。

当然,你还需要在某个地方保持index;在古典 递归,这将作为一个额外的函数参数。

坦率地说,我构造所有这些子串。它远远更多 在C ++中使用idiomatic来使用迭代器。我会包装递归 以非递归方式运行,这样用户就不必通过 在任何额外的参数中:用户可能会调用类似:

int
indexOf( std::string const& text, std::string const& target )
{
    return indexOf( 0, text.begin(), text.end(), target );
}

或者,没有通过额外的论点:

int
indexOf( std::string const& text, std::string const& target )
{
    std::string::const_iterator results 
            = search( text.begin(), text.end(), target );
    return results == text.end()
        ?  -1
        :  results - text.begin();
}

(我假设这是家庭作业;通常不会使用递归 对于像这样的问题。否则,当然,只需致电std::search 在第二个版本中,工作完成了。或text.find( target ), 它几乎完全返回你想要的东西。)