在字符串C ++中查找子字符串(在“hello”中找到“el”)

时间:2012-11-22 08:38:59

标签: c++ string recursion find substring

好的,所以我一直在寻找可以帮助我在子字符串中找到字符串的算法。 我之前使用的代码来自similar question,但它没有这样做。

// might not be exposed publicly, but could be
int index_of(string const& haystack, int haystack_pos, string const& needle) {
  // would normally use string const& for all the string parameters in this
  // answer, but I've mostly stuck to the prototype you already have

  // shorter local name, keep parameter name the same for interface clarity
  int& h = haystack_pos;

  // preconditions:
  assert(0 <= h && h <= haystack.length());

  if (needle.empty()) return h;
  if (h == haystack.length()) return -1;
  if (haystack.compare(h, needle.length(), needle) == 0) {
    return h;
  }
  return index_of(haystack, h+1, needle);
}

int index_of(string haystack, string needle) {
  // sets up initial values or the "context" for the common case
  return index_of(haystack, 0, needle);
}

这不会在字符串“hello”上返回“el”的起始索引,我无法弄明白。

编辑: 好的,让我向您展示一些代码,包括一些现实生活中的例子: 我正在尝试分析一个字符串,它是我想要在我的文件系统中排序的文件的路径。 输入示例如下:

输入:/media/seagate/lol/Sons.of.Anarchy.S04.720p.HDTV.x264/Sons.of.Anarchy.S04E01.720p.HDTV.x264-IMMERSE.mkv

当我尝试解析此字符串以通过检测SxxExx的存在来获取其名称时,我会查找“s0”,“S0”等(我知道这不是我试图查看的最佳实现它工作,稍后查看代码)。因此,当我使用该输入时,我得到的输出是:

input:/media/seagate/lol/Sons.of.Anarchy.S04.720p.HDTV.x264/Sons.of.Anarchy.S04E01.720p.HDTV.x264-IMMERSE.mkv

aux: 0p.HDTV.x264-IMMERSE.mkv

input:/media/seagate/lol/Sons.of.Anarchy.S04.720p.HDTV.x264/Sons.of.Anarchy.S04E01.720p.HDTV.x264-IMMERSE.mkv

aux: 1.720p.HDTV.x264-IMMERSE.mkv

input:/media/seagate/lol/Sons.of.Anarchy.S04.720p.HDTV.x264/Sons.of.Anarchy.S04E01.720p.HDTV.x264-IMMERSE.mkv

aux: 264-IMMERSE.mkv

辅助输出:S04E01.720p.HDTV.x264-IMMERSE.mkv

因此,您可以看到它只是查找字符串中的任何字符并停止,这也会考虑多个有效的“已发现”,这应该只是一个。

我正在尝试使用它的完整代码是:

bool StringWorker::isSeries(size_t &i) {

    size_t found1, found2, found3, found4, found5, found6;
    found1 = input->find_last_of("S0"); //tried several find functions including the
    found2 = input->find_last_of("S1"); //index_of() mentioned above in the post
    found3 = input->find_last_of("S2");
    found4 = input->find_last_of("s0");
    found5 = input->find_last_of("s1");
    found6 = input->find_last_of("s2");

    if (found1 != string::npos) {
        if (input->size() - found1 > 6) {
            string aux = input->substr(found1, input->size());
            cout << "input:" << *input << endl;
            cout << "aux: " << aux << endl;
            if (isalpha(aux.at(0)) && isdigit(aux.at(1)) && isdigit(aux.at(2))
                    && isalpha(aux.at(3)) && isdigit(aux.at(4))
                    && isdigit(aux.at(5))) {
                i = found1;
                return true;
            }
        }
    }
    if (found2 != string::npos) {
        if (input->size() - found2 > 6) {
            string aux = input->substr(found2, input->size());
            cout << "input:" << *input << endl;
            cout << "aux: " << aux << endl;
            if (isalpha(aux.at(0)) && isdigit(aux.at(1)) && isdigit(aux.at(2))
                    && isalpha(aux.at(3)) && isdigit(aux.at(4))
                    && isdigit(aux.at(5))) {
                i = found2;
                return true;
            }
        }
    }

    if (found3 != string::npos) {
        if (input->size() - found3 > 6) {
            string aux = input->substr(found3, input->size());
            cout << "input:" << *input << endl;
            cout << "aux: " << aux << endl;
            if (isalpha(aux.at(0)) && isdigit(aux.at(1)) && isdigit(aux.at(2))
                    && isalpha(aux.at(3)) && isdigit(aux.at(4))
                    && isdigit(aux.at(5))) {
                i = found3;
                return true;
            }
        }

    }
    if (found4 != string::npos) {
        if (input->size() - found4 > 6) {
            string aux = input->substr(found4, input->size());
            cout << "input:" << *input << endl;
            cout << "aux: " << aux << endl;
            if (isalpha(aux.at(0)) && isdigit(aux.at(1)) && isdigit(aux.at(2))
                    && isalpha(aux.at(3)) && isdigit(aux.at(4))
                    && isdigit(aux.at(5))) {
                i = found4;
                return true;
            }
        }

    }
    if (found5 != string::npos) {
        if (input->size() - found5 > 6) {
            string aux = input->substr(found5, input->size());
            cout << "input:" << *input << endl;
            cout << "aux: " << aux << endl;
            if (isalpha(aux.at(0)) && isdigit(aux.at(1)) && isdigit(aux.at(2))
                    && isalpha(aux.at(3)) && isdigit(aux.at(4))
                    && isdigit(aux.at(5))) {
                i = found5;
                return true;
            }
        }

    }
    if (found6 != string::npos) {
        if (input->size() - found6 > 6) {
            string aux = input->substr(found6, input->size());
            cout << "input:" << *input << endl;
            cout << "aux: " << aux << endl;
            if (isalpha(aux.at(0)) && isdigit(aux.at(1)) && isdigit(aux.at(2))
                    && isalpha(aux.at(3)) && isdigit(aux.at(4))
                    && isdigit(aux.at(5))) {
                i = found6;
                return true;
            }
        }

    }

    return false;

}

你能在这里看到什么问题吗?

3 个答案:

答案 0 :(得分:6)

为什么不使用find()的{​​{1}}方法 - &gt; link

答案 1 :(得分:3)

此代码通过index = sub_str.find("el")返回索引:

#include <iostream>
#include <string>
using namespace std;

int main ()
{
  string sub_str="abc def ghi jk lmnop  hello";

  string sub_str2;
  size_t index;


  index = sub_str.find("el");     
  sub_str2 = sub_str.substr (index);   

  cout<<"index = "<<index<<"\n";
  cout<<sub_str2<<"\n";

  return 0;
}

答案 2 :(得分:0)

要在字符串中查找子字符串及其索引,您可以尝试这一点 -

int find_sub(const std::string& mstring,sub)
{
  int lensub=sub.length(),len=mstring.length(),f=0,pos;
  std::string b="";
  for(int i=0;i<len-lensub;i++)
  {
    for(int j=i,k=0;j<i+lensub;j++,k++)
      b[k]=mstring[j];
    if(b.compare(sub)==0)
    {
      f=1;
      pos=i;
      break;
    }
  } 
  if(f==1)
    cout<<"substring found at: "<<pos+1;
  else
    cout<<"substring not found!";
  return f;
}

您还可以通过删除break;并每次增加f的值来检查子串出现的次数。还可以通过将pos转换为数组来获取索引。