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

C++ 字符串递归函数中的字符串错误,c++,recursion,C++,Recursion,我试图编写的递归函数有问题。函数的目的是在字符串中查找一个字符串,然后使用递归返回第二个字符串位于第一个字符串中的索引 我能做到这一点。当第二个字符串不包含在第一个字符串中时,问题就出现了。我想告诉用户没有找到第二个字符串。我无法让它传递那个信息 int index_of(string s, string t){ int len1 = s.length(), len2 = t.length(), index = 0; if (len1==len2){ if (s.substr(

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

我能做到这一点。当第二个字符串不包含在第一个字符串中时,问题就出现了。我想告诉用户没有找到第二个字符串。我无法让它传递那个信息

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

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

如果第一个字符串不包含第二个字符串,则索引将无限递增,使字符串长度为零。因此,您必须检查第一个字符串是否比第二个字符串短。如果是,则它不包含子字符串

  if (len1 < len2){
    // first string doesn't contain the second
    return -2;
  }else if (len1==len2){
    ...
但这里根本不应该使用递归函数。还有一个内置函数find in string:
检查此问题:

首先,您发布的代码中存在许多问题 在大多数情况下,它不会编译,因为您没有定义 的索引_中的索引。当然,你只做 两个字符串长度相同时的比较。但它是 很难弄清楚你要做的比较是什么 确实如此,因为您基于未定义的变量获取子字符串 指数如果索引为0,则没有必要使用 子字符串,如果索引不是0,则 s、 substr index,len2==t永远不可能为真,因为只有 如果s和t的长度相同,则输入此分支

你真正需要做的是用简单的英语定义什么 该功能应执行以下操作:

如果s短于t,则不可能匹配,因此 返回-1

否则,如果s的起点等于t,则返回 当前索引

否则,将在s的子字符串上递归,删除 第一个字符和递增索引

当然,您还需要在某处维护索引;古典的 递归,这将作为一个附加函数参数

坦率地说,我不会构造所有这些子字符串。远不止这些 C++中使用迭代器的习惯用法。我会把递归 函数,这样用户就不必通过 在任何额外参数中:用户可能会调用以下内容:

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,
它几乎完全返回您想要的内容。

您不应该为此使用递归函数。在大字符串中,你会得到堆栈溢出。我不是C++程序员,但你能比较这样的字符串:“STR1= = STR2”吗?你不需要使用strcmpr1,str2吗?我认为第一个选项只比较字符串的地址?如果s不包含t,您希望函数做什么的可能重复?给stdout写封信?抛出异常?返回-1?2个问题。1调用者将增加-1。2长度比较应为>=not==std::查找单个字符。要搜索子字符串,您需要std::search。不完全是这样,有几个重载:但您不是这么说的。我对内置函数的唯一解释是标准库函数,而不是成员函数。是的,通过内置函数,这个函数已经存在于std::string中。