使用字符串进行递归::find()

Recursion with string::find()

本文关键字:find 递归 字符串      更新时间:2023-10-16

首先,我想说是的,这是一项家庭作业,尽管我不是要求你帮我做,而是请求帮助解释它为什么会崩溃。编写一个函数subCount(),它采用两个字符串参数"str""sub",并检查"sub""str"中出现多少次,返回一个int,这是一个递归问题。必须使用递归。这是我使用<string>std命名空间的代码。

int subCount(const string& str, const string& sub)
{
    if (str.find(sub != string::npos))
    {
        return 1 + subCount(str.substr(1, str.length()), sub);
    }   
    else 
    {
        return subCount(str.substr(1, str.length()), sub);
    }
}

它构建良好(使用visualstudio2012),但在尝试运行时崩溃。我怀疑我没有正确使用find()函数,但我无法理解cplusplus.com上的引用,因为字符串参数的引用是"size_t find (const string& str, size_t pos = 0) const noexcept;"。目前,我对find()的理解是,如果"sub"str中,那么它返回true,导致return 1 + subCount(str.substr(1), sub);执行,如果不是,那么另一个返回语句。如果这不是find()函数的问题,请说明问题所在,而不是如何解决。感谢您花时间阅读本文。

函数崩溃是因为空字符串上的

Stackoverflow(递归函数崩溃的最常见原因)substr

函数的所有分支都递归地调用自己,并且永远不会停止。

你需要检查str是否为空字符串,如果是,则返回0。因为这是一个家庭作业,所以我不会为你发布工作代码。

您需要检查find函数的使用情况。我无法编译你的函数。

要求是使用递归搜索模式在字符串中出现的次数。

解决方案:

  1. 您应该使用find func,但请记住find func返回它找到模式的位置,所以在每次成功的find()之后,您将不得不跳过搜索的部分,并在剩余的字符串中搜索
  2. 使用find的正确语法

str.find(sub!=字符串::npos)//这是错误的。