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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/13508670/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-27 17:25:24  来源:igfitidea点击:

Finding substring within string C++ (find "el" in "hello")

c++stringrecursionfindsubstring

提问by HymanTakahashi

OK, so I was looking for an algorithm that could help me find a string within a substring. The code I was using before was from a similar questionbut it doesn't do it.

好的,所以我正在寻找一种可以帮助我在子字符串中找到字符串的算法。我之前使用的代码来自一个类似的问题,但它没有这样做。

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

this doesn't return the start index of "el" on the string "hello" and I can't figure it out.

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

EDIT: OK, let me show you a bit more of the code including some real-life examples: I'm trying to analyze a string that is a path to a file I want to sort in my filesystem. An input example is this:

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

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

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

when I try to parse this string to get the name of the by detecting the presence of SxxExx,I look for "s0","S0", etc (I know it's not the best implementation I was just trying to see if it worked and look at the code later). So when I use that input, what I get on the output is:

当我尝试通过检测 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

intended output for aux: S04E01.720p.HDTV.x264-IMMERSE.mkv

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

So as you can see it's just looking for any char that is in the string and stops, which also accounts for the multiple valid "found"s which should've been just the one.

因此,正如您所看到的,它只是在查找字符串中的任何字符并停止,这也说明了多个有效的“找到”应该只是一个。

the full code where I'm trying to use this is:

我试图使用它的完整代码是:

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;

}

Can you see anything wrong here?

你能看出这里有什么问题吗?

回答by Lyubomir Vasilev

Why don't you use the find()method of std::string-> link.

你为什么不使用-> linkfind()方法。std::string

回答by Software_Designer

This code returns the index through index = sub_str.find("el"):

此代码通过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;
}

回答by TubbyStubby

For finding a substring and its index in a string you can try this out -

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

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

You also check how many times substring appears by removing break;and increasing value of f every time. Also get their indexes by converting pos to an array.

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