我有两个CString s1
和CString s2
。我需要在 s1 中找到最后一个条目 s2。我可以在 CString 中找到任何方法,例如在 C# LastIndexOf 中。我是 C++ 中的菜鸟。提前致谢。
5 回答
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;
};
}
一种更优化的算法会首先反转字符串,我将其留作练习。
您不需要实现自我功能。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
我采用了 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;
}
没有CString
办法直接解决您的问题。但是,您可以使用CString::ReverseFind
+的组合_tcsncmp
首先定位子字符串最后一个字符的下一个匹配项,如果找到,则从那里比较整个子字符串。
我认为 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 的数组。