如何返回目录的末尾

时间:2012-05-30 13:28:53

标签: c++ string directory

我有一个函数应该找到字符串中目录的最后一位。例如: “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

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

4 个答案:

答案 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)

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

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

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