C++ 删除CString的开头

C++ 删除CString的开头,c++,mfc,substring,C++,Mfc,Substring,我以CString的形式接收文件路径。例如:C:\Program Files\Program\Maps\World\North America 我需要在映射之前删除所有内容。例如C:\Program Files\Program\但此文件路径可能不同 我试过: CString noPath = fullPath; fullPath.Truncate(fullPath.ReverseFind('Maps')); noPath.Replace(_T(fullPath),_T("")); 这并不总是有

我以CString的形式接收文件路径。例如:C:\Program Files\Program\Maps\World\North America

我需要在映射之前删除所有内容。例如C:\Program Files\Program\但此文件路径可能不同

我试过:

CString noPath = fullPath;
fullPath.Truncate(fullPath.ReverseFind('Maps'));
noPath.Replace(_T(fullPath),_T(""));

这并不总是有效的。它在错误的位置剪切了一些文件路径。该解决方案不需要使用Truncate/Replace,但我不确定如何执行此操作

我熟悉的
CString
没有
Truncate
成员,并且
ReverseFind
仅适用于单个字符,而不适用于子字符串;所以
fullPath
的类型对我来说是个谜

我注意到一件事:
\u T(fullPath)
出现在代码中,但是
\u T
宏只适用于文本(带引号的字符串或字符)

无论如何,这里有一个
CString
唯一的解决方案

CString TruncatePath(CString path, CString subdir) {
    CString sub = path;
    const int index = sub.MakeReverse().Find(subdir.MakeReverse());
    return index == -1 ? path : path.Right(index + subdir.GetLength());
}
    ...

CString path     = _T("C:\\Program Files\\Program\\Maps\\World\\North-America");
CString sub_path = TruncatePath(path, _T("Maps\\"));

为您提供
子路径
Maps\World\North America

为此,您可以使用
删除
功能

例如:

CString path(_T("C:\\Program Files\\Program\\Maps\\World\\North-America"));
path.Delete(0, path.Find(_T("Maps")));  //pass first index and number of count to delete

现在变量
path
具有值
Maps\\World\\North America

“Maps”应该是“Maps”,请提供一个简洁的问题描述。到目前为止,您所陈述的内容可能会被任何一方截断。根据我们掌握的信息,这个问题无法解决。如果您将标记从
C++
更改为
C++/cli
,或者至少包含该标记,您可能会获得更好的运气。我发现使用windows stuff处理路径很麻烦,更不用说使用CString了。一旦我开始使用
Boost Filesystem
,我就再也不回头了。我只需要在索引中添加5,这样它就可以打印“地图\世界\北美”,但这非常有效。谢谢,我更新了函数,使subdir现在保留在返回的截断路径的开头。如果找不到子字符串,这将以未定义的方式失败。而
CString::Find
-调用也将匹配目录名的子字符串。这适用于示例输入,但仅限于此。