c++递归扫描字符串
C++ recursion scanning with strings
我有一个使用递归的作业。我在理解递归,或者至少它是如何工作的方面仍然有一点困难,但我想我开始掌握它了,尽管我不太确定为什么任何东西都是工作的。
我的作业有两部分,但目前,我只需要第一部分的一点帮助。下面是我要做的:
写一个递归函数,返回C字符串中>字符第一次出现的位置
这是我到目前为止所做的…
#include <stdio.h>
#include <string>
#include <iostream>
using namespace std;
int test(string s, char x);
int main ()
{
test("lets test for the letter s", "s" );
}
int test(string s, char x)
{
if(s.length() == 0)
return 0;
else if (s[0] == x)
return 1 + test(s.substr(1, s.length()), x);
else
return test(s.substr(1, s.length()), x);
}
所以我认为这应该工作,但我有点困惑的是如何得到函数来测试任何东西。我很确定我在main中的函数调用中正确地完成了字符串部分,但我无法让char接受值。我的理解是,我应该输入我想要扫描的文本,然后输入我想要查找的字符。有人能告诉我哪里做错了吗,或者我和递归函数很接近?
您应该做如下操作:
int main ()
{
test("lets test for the letter s", 's');
//should pass char constant
//not string literal for second parameter
}
int test(string s, char x)
{
if(s.length() == 0)
return 0;
else if (s[0] == x)
return 1 + test(s.substr(1, s.length()-1), x);
//^^^second parameter of substring is length
else
return test(s.substr(1, s.length()), x);
}
字符常量放在单引号中。要测试你的函数,可以这样写:
cout << test("lets test for the letter s", 's') << endl;
对于递归函数,很接近了。if
语句有正确的测试,您只需要稍微调整一下return
语句。
if (s.length() == 0)
return -1;
如果字符串为空,则没有找到该字符。我建议返回-1而不是0,因为返回值为0表明(对我来说)该字符位于位置0。-1是这些函数在找不到字符时的传统返回码。
else if (s[0] == x)
return 0;
你知道为什么这是return 0
吗?您在索引0处发现了字符x
,因此您应该返回:0
!
else
return 1 + test(s.substr(1, s.length() - 1), x);
最后一个测试是唯一需要递归的测试。这是你放1 +
的地方。你还需要减少1 length()
"s"将被视为字符数组或字符串。要表示单个字符,应该使用's'
int main ()
{
cout << "location = " << test("lets test for the letter s", 's' );
^^^^
}