我正在尝试写一个递归函数的问题。该函数的目的是在字符串中查找字符串,然后使用递归返回第一个字符串位于第一个字符串内的索引。
我能够做到这一点。第二个字符串未包含在第一个字符串中时出现问题。我想向用户说明找不到第二个字符串。我不能让它传达这个信息。
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;
}
任何帮助将不胜感激! :)
答案 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
;如果index
是0
,那么就没有意义
子串,如果index
不是0
,那么
s.substr( index, len2 ) == t
永远不会是真的(因为你只是
如果s
和t
的长度相同,请输入此分支。
你真正需要做的是从简单的英语定义什么 该功能应该:
如果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 )
,
它几乎完全返回你想要的东西。)