C++ C++;带字符串的递归扫描

C++ C++;带字符串的递归扫描,c++,recursion,C++,Recursion,我正在做一个使用递归的作业。我在理解递归方面仍然有点困难,或者至少它是如何工作的,但我想我已经开始掌握它了,尽管我不太清楚为什么任何东西都能工作 我的作业分为两部分,但目前,我只需要在第一部分得到一些帮助。我要做的是: 编写一个递归函数,返回C字符串中第一次出现>字符的位置 这就是我目前所拥有的 #include <stdio.h> #include <string> #include <iostream> using namespace std; int t

我正在做一个使用递归的作业。我在理解递归方面仍然有点困难,或者至少它是如何工作的,但我想我已经开始掌握它了,尽管我不太清楚为什么任何东西都能工作

我的作业分为两部分,但目前,我只需要在第一部分得到一些帮助。我要做的是:

编写一个递归函数,返回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);
}
#包括
#包括
#包括
使用名称空间std;
int测试(字符串s,字符x);
int main()
{
测试(“让我们测试字母s”、“s”);
}
int测试(字符串s,字符x)
{
如果(s.length()==0)
返回0;
如果(s[0]==x),则为else
返回1+测试(s.substr(1,s.length()),x);
其他的
返回测试(s.substr(1,s.length()),x);
}

所以我认为这应该是可行的,但我有点困惑,如何让函数测试任何东西。我很确定我在main中的函数调用中正确地完成了字符串部分,但是我无法让char接受值。按照我的理解,我应该输入要扫描的文本,然后输入要查找的字符。谁能告诉我我做错了什么,甚至我对递归函数的理解都很接近吗?

字符常量用单引号引起来。要测试函数,请编写如下代码:

cout << test("lets test for the letter s", 's') << endl;
如果字符串为空,则找不到字符。我建议返回-1而不是0,因为返回值为0表示(对我来说)字符位于位置0-1是这样的函数在找不到字符时的传统返回码

else if (s[0] == x)
    return 0;
你明白为什么这是
返回0
?您在索引0处找到了字符
x
,因此您应该返回:
0

else
    return 1 + test(s.substr(1, s.length() - 1), x);

最后一个测试是唯一需要递归的测试。这里是放置
1+
的位置。您还需要将
length()
减少1。

字符常量用单引号括起来。要测试函数,请编写如下代码:

cout << test("lets test for the letter s", 's') << endl;
如果字符串为空,则找不到字符。我建议返回-1而不是0,因为返回值为0表示(对我来说)字符位于位置0-1是这样的函数在找不到字符时的传统返回码

else if (s[0] == x)
    return 0;
你明白为什么这是
返回0
?您在索引0处找到了字符
x
,因此您应该返回:
0

else
    return 1 + test(s.substr(1, s.length() - 1), x);

最后一个测试是唯一需要递归的测试。这里是放置
1+
的位置。您还需要将
length()
减少1。

您应该执行以下操作:

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

您应该执行以下操作:

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);
}
“s”将被视为字符数组或字符串。要表示单个字符,应使用“s”

int main ()
{
  cout << "location  = " << test("lets test for the letter s", 's' );
                                                               ^^^^
}
int main()
{
cout“s”将被视为字符数组或字符串。要表示单个字符,应使用“s”

int main ()
{
  cout << "location  = " << test("lets test for the letter s", 's' );
                                                               ^^^^
}
int main()
{

哈哈!没错!我从来没有想过对这个角色使用一个引号,我可能会为此痛苦一周,非常感谢!@CharlieM很高兴我能帮上忙。检查其他答案,了解你的递归问题。哈哈!没错!我从来没有想过对这个角色使用一个引号,我很高兴很可能会为此痛苦一个星期,非常感谢!@CharlieM很高兴我能帮上忙。检查其他答案,了解你的递归问题。我最终选择了这辆车我最终选择了这辆车你的右边,我在前面突然出现了一个s,它一起跳过了,然后去数一数下一辆车。谢谢,我永远也不会明白。递归目前对我来说还是有点狡猾。你的权利,我只是在前面突然出现了一个s,它一起跳过了,然后去数一数下一个。谢谢,我永远也不会明白。递归目前对我来说还是有点狡猾。