CString找到最后一个条目

时间:2012-08-16 09:07:12

标签: c++ mfc

我有两个CString s1CString s2。我需要找到s1中的最后一个条目s2。 我可以在CString中找到任何类似C#LastIndexOf的方法。 我在c ++中很高兴。提前谢谢。

5 个答案:

答案 0 :(得分:4)

CString没有这样的功能。你必须自己写,例如

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

更优化的算法会首先反转字符串,我将其作为练习。

答案 1 :(得分:1)

您不需要实现自我功能。 std提供了一个函数:std :: string :: find_last_of。 例如:

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

答案 2 :(得分:1)

我采用了安德烈的答案(增加next_pos,似乎在没有它的情况下导致无限循环)。 aaand,因为我还没有足够的重点(无法评论)我会把它作为一个单独的答案发布:

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

答案 3 :(得分:0)

没有CString方法直接解决您的问题。但是,您可以使用CString::ReverseFind + _tcsncmp的组合来首先找到子字符串的最后一个字符的下一个匹配项,如果找到,则从那里比较整个子字符串。

答案 4 :(得分:0)

CString是我认为“Microsoft基础类库”的一部分而不是标准C ++。 这里有一个参考包括方法:

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

我没有看到任何东西将它直接转换为std :: string(它有更多的方法),但它可能也不是那么难(搜索“CString to std :: string”和你会找到一些东西。

虽然它们可能是相关的,但不要将它与c-string混淆,c-string是标准C ++中包含的标准C的chars数组。