c++递归扫描字符串

C++ recursion scanning with strings

本文关键字:字符串 扫描 递归 c++      更新时间:2023-10-16

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

我的作业有两部分,但目前,我只需要第一部分的一点帮助。下面是我要做的:

写一个递归函数,返回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' );
                                                               ^^^^
}