我有一个函数应该找到字符串中目录的最后一位。例如: “C:\ Lolcats \ pie \ ambulance \”应该返回“救护车”。然而,它返回了一些我从未见过的奇怪角色,如男性箭头符号和其他一些奇怪的东西。
string App::getlastName(string cakes){
//finds the name of the last folder in a directory
string name;
string temp;//popback all of temp into name to invert it
cakes.pop_back();
char i = cakes[cakes.length()-1];
while (i != '\\'){
temp.push_back(cakes[i]);
cakes.pop_back();
i = cakes[cakes.length()-1];
} //-1?
for (int j = 0; j<temp.length(); ++j){
name.push_back(temp.back());
temp.pop_back();
}
return name;
}
这可能是我写过的最糟糕的功能之一,但我想不出还有什么可以结束这个结局:(有人可以帮我吗?:D
请注意,该功能不需要查找文件的名称,它只是文件夹。
答案 0 :(得分:4)
两个步骤:
如果以反斜杠字符结尾,请将其删除:
if (!cakes.empty() && '\\' == *(cakes.end() - 1))
{
cakes.erase(cakes.end() - 1);
}
使用std::string::find_last_of()
找到最后一个反斜杠,使用std::string::substr()
来提取最后一个部分:
std::string last_part;
const size_t slash_idx = cakes.find_last_of("\\");
if (std::string::npos != slash_idx)
{
last_part = cakes.substr(slash_idx + 1);
}
如果目录名可能包含正斜杠,则添加对最后一个字符的附加检查,并将其添加到find_last_of("\\/")
的参数中,因为它可以搜索多个字符。
答案 1 :(得分:2)
如果从字符串中删除尾随\,则可以使用rfind和substr的简单组合来获取所需的数据。
string substring = cakes.substr(cakes.rfind("\\") + 1);
答案 2 :(得分:0)
你的方法取决于字符串已经是正确的格式,没有断言或错误检查 - 不是一个好主意。
我会做类似的事情:
char* directoryName = strrchr(fullPath, '\\') + 1;
删掉尾随的'\'后。
答案 3 :(得分:0)
temp.push_back(cakes[i])
是一个问题是正确的,但我想我会详细说明。
原因是变量i
被定义为char
而非int
,但两者可能会被隐式转换。因此,返回奇怪字符的原因是因为将char
强制转换为int
会导致索引值在您的字符串中可能不存在。
阅读你的代码示例看起来你应该做temp.push_back(cakes[cakes.length()-1])
而不是(或者更好,将这个索引存储在一个临时变量中,这样你就不必每次都写它了。)