CString find the last entry

后端 未结 5 1801
无人共我
无人共我 2021-01-23 08:18

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++.

相关标签:
5条回答
  • 2021-01-23 08:39

    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.

    0 讨论(0)
  • 2021-01-23 08:45

    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++.

    0 讨论(0)
  • 2021-01-23 08:48

    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.

    0 讨论(0)
  • 2021-01-23 08:54

    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;
    }
    
    0 讨论(0)
  • 2021-01-23 09:02

    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
    
    0 讨论(0)
提交回复
热议问题