2

我有两个CString s1CString s2。我需要在 s1 中找到最后一个条目 s2。我可以在 CString 中找到任何方法,例如在 C# LastIndexOf 中。我是 C++ 中的菜鸟。提前致谢。

4

5 回答 5

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

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

于 2012-08-16T09:15:40.470 回答
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
于 2013-06-13T12:18:19.877 回答
1

我采用了 Andrey 的答案(为了增加 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;
}
于 2013-07-25T03:40:07.073 回答
0

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

于 2012-08-16T09:14:40.817 回答
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 混淆,后者是chars标准 C++ 中包含的标准 C 的数组。

于 2012-08-16T09:15:21.817 回答