我有两个CString s1
和CString s2
。我需要找到s1中的最后一个条目s2。
我可以在CString中找到任何类似C#LastIndexOf的方法。
我在c ++中很高兴。提前谢谢。
答案 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
数组。