CString find the last entry

2020-04-19 06:55发布

问题:

I have two CString s1 and CString s2. I need find the last entry s2 in s1. I can find any metod in CString like in C# LastIndexOf. I am nooby in c++. Thanks in advance.

回答1:

CString has no such function. You have to write it yourself, e.g.

int LastIndexOf(const CString& s1, const CString& s2)
  {
  int found = -1;
  int next_pos = 0;
  for (;;)
    {
    next_pos = s1.Find(s2, next_pos);
    if (next_pos == -1)
      return found;

    found = next_pos;
    };
  }

A more optimal algorithm would reverse the strings first, I'm leaving that as an exercise.



回答2:

you don't need implement a self function. std has provide a function: std::string::find_last_of. for example:

std::string str("c:\windows\winhelp.exe");
unsigned found = str.find_last_of("/\\");
std::cout << " path: " << str.substr(0,found) << '\n';
std::cout << " file: " << str.substr(found+1) << '\n';


path: c:\windows
file: winhelp.exe


回答3:

i adopted the answer from Andrey (to increment the next_pos, seems to cause an endless loop without it). aaand, since i don't have enough repu points yet (can't comment) i'll post it as a separate answer:

int LastIndexOf(const CString& s1, const CString& s2)
{
    int start = s1.Find(s2, 0);

    if (start >= 0) 
    {
        while (start < s1.GetLength()) 
        {
            int idx = s1.Find(s2, start+1); 
            if (idx >= 0) 
                start = idx; 
            else 
                break; 
        }
    }

    return start;
}


回答4:

There is no CString method to directly address your question. However, you can use a combination of CString::ReverseFind + _tcsncmp to first locate next occurrence of last character of substring and, if found, compare the whole substring from there.



回答5:

CString is I think part of the "Microsoft Foundation Class Library" and is not Standard C++. There is a reference including methods here:

http://msdn.microsoft.com/en-us/library/aa315043%28v=vs.60%29.aspx

I don't see anything to turn that directly into a std::string (which has a lot more methods), but it probably is not so hard, either (search for "CString to std::string" and you'll find some stuff).

Although they are presumably related, don't confuse this with a c-string, which is an array of chars from Standard C included in Standard C++.



标签: c++ mfc