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中。