0

我有一个函数应该在字符串中找到目录的最后一位。例如:“C:\Lolcats\pie\ambulance\”应该返回“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

请注意,该函数不需要查找文件的名称,它只是文件夹。

4

4 回答 4

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("\\/"),因为它可以搜索多个字符。

于 2012-05-30T13:41:30.750 回答
2

如果您从字符串中删除尾随 \,您可以使用 rfind 和 substr 的简单组合来获取您想要的数据。

string substring = cakes.substr(cakes.rfind("\\") + 1);
于 2012-05-30T13:45:30.000 回答
0

你的方法依赖于字符串已经是正确的格式,没有断言或错误检查——这不是一个好主意。

我只会做类似的事情:

char* directoryName = strrchr(fullPath, '\\') + 1;

在您修剪掉尾随的“\”之后。

于 2012-05-30T13:43:22.297 回答
0

@Joel Rondeau 的评论他说这条线temp.push_back(cakes[i])是一个问题是正确的,但我想我会详细说明。

原因是该变量i被定义为 achar而不是 a int,但两者可能被隐式转换。因此,返回奇怪字符的原因是因为将 achar转换为 anint会导致字符串中可能不存在的索引值。

阅读您的代码示例,看起来您应该这样做temp.push_back(cakes[cakes.length()-1])(或者更好的是,将此索引存储在临时变量中,这样您就不必每次都继续编写它)。

于 2012-05-30T13:48:57.457 回答