从C ++中的文件路径中提取文件名

时间:2018-07-07 14:46:31

标签: c++ indexing stdstring

我有一个文件存储路径的字符串,我正在做一些字符串处理,为std::string对象建立索引,但是输出的字符串很奇怪,代码:

#include<iostream>
#include<string>

using namespace std;

int main()
{
    string x = "C:\\Users\\lenovo\\Desktop\\QBFdata.txt";
    string temp = "";
    for(int  i = x.length() - 1; i > 0; i--)
    {
        if(x[i] == '\\')
            break;
        else
            temp.append(&x[i]);
    }
 cout << temp << "\n";
}

但是输出显然很奇怪,它再次将temp的内容附加到了它。

  

txttxt.txta.txtta.txtata.txtdata.txtFdata.txtBFdata.txtQBFdata.txt

请不要为此提出任何替代方案,因为我已经有了解决方案

int main()
{
    string x = "C:\\Users\\NK\\Desktop\\QBFdata.txt";
    int pos = x.find_last_of('\\');
    string temp = x.substr(pos + 1);
    cout << temp;
}

它工作正常。

我想知道第一个代码是什么问题。

谢谢。

我正在使用代码块16.01

3 个答案:

答案 0 :(得分:1)

好的,像这样:

您的原始代码首先从字符串的末尾开始,因此,您的代码第一次运行if(x[i] == '\\')行时,它就在x[34]处。

x[34]是路径结尾处的"t"

接下来,您的代码会将其追加到尚未为空的临时字符串中。

下次迭代时,它会查看x[33]

x[33]是对'x'字符的引用。现在,如果您一次只追加一个字符,那么一切都会很好(除非您的字符串向后)。但是,一个字符串的append函数会追加另一个字符串,所以我想发生了什么(如果我错了,更多有经验的程序员请纠正我),我认为编译器正在从char*进行隐式转换(这就是一个C样式字符串(如果它以null结尾)是一个std::string对象,并附加该字符串。

这意味着它将从'x'字符开始附加c字符串,因此这一次它将"xt"从上方附加到t的后面。

下一次迭代引用以x [32]开头的c字符串,因此它附加了"txt" 下次迭代引用了一个以x [31]开头的c字符串,因此它附加了".txt" 下次迭代引用了一个以x [30]开始的c字符串,因此它附加了"a.txt" 然后"ta.txt",依此类推...

总共可以为您提供以下字符串,并按以下顺序附加所有字符串:

"t" + "xt" + "txt" + ".txt" + "a.txt" + "ta.txt" + "ata.txt" + "data.txt" + "Fdata.txt" + "BFdata.txt" + "QBFdata.txt"

将最终字符串呈现为:"txttxt.txta.txtta.txtata.txtdata.txtFdata.txtBFdata.txtQBFdata.txt"

希望这会有所帮助。

祝您编程愉快! :)

答案 1 :(得分:0)

获得此输出的原因是因为您这样做:

temp.append(&x[i]);

不添加单个字母, 而是来自索引i的字符串的整个后缀。 这是我在每次迭代中打印temp时代码的输出

temp.append(&x[i]);
cout << temp << "\n";

输出显示您首先附加单个字母t,然后附加xt,然后附加txt,等等。

t
txt
txttxt
txttxt.txt
txttxt.txta.txt
txttxt.txta.txtta.txt
txttxt.txta.txtta.txtata.txt
txttxt.txta.txtta.txtata.txtdata.txt
txttxt.txta.txtta.txtata.txtdata.txtFdata.txt
txttxt.txta.txtta.txtata.txtdata.txtFdata.txtBFdata.txt
txttxt.txta.txtta.txtata.txtdata.txtFdata.txtBFdata.txtQBFdata.txt
txttxt.txta.txtta.txtata.txtdata.txtFdata.txtBFdata.txtQBFdata.txt

答案 2 :(得分:0)

正如其他人所述,问题是您使用了错误的std::string::append()重载,因此您在每次循环迭代中都附加了整个子字符串,而不是单个字符。

要一次附加一个字符,请改用以下字符之一:

temp.append(&x[i], 1);

temp.push_back(x[i]);

temp += x[i];

但是,由于要向后循环,因此您需要在字符串的前部添加每个字符,而不是附加到BACK:

temp.insert(0, &x[i], 1);

temp = x[i] + temp;