2

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 question but 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.

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

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:

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

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?

4

3 に答える 3

6

-> linkfind()の方法を使ってみませんか。std::string

于 2012-11-22T08:42:08.500 に答える
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;
}
于 2012-11-22T09:12:55.687 に答える
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 を配列に変換してインデックスを取得します。

于 2016-05-12T08:31:02.203 に答える