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

C++ 从c+中的文件路径提取文件名+;,c++,indexing,stdstring,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(

我有一个存储文件路径的字符串,我正在做一些字符串处理,索引一个
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";
}
它很好用

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

谢谢


我使用的是codeblocks 16.01

您获得此输出的原因是:

temp.append(&x[i]);
它不附加一个字母, 而是索引
i
中字符串的整个后缀。 这是我在每次迭代中打印temp时的代码输出

temp.append(&x[i]);
cout << temp << "\n";
好的,是这样的:

原始代码首先从字符串的后面开始,因此当代码第一次运行
if(x[i]='\\')
行时,它正在查看
x[34]

x[34]
是路径末尾的
“t”

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

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

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

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

下一次迭代引用一个从x[32]开始的c字符串,因此它附加了
“txt”
下一次迭代引用一个从x[31]开始的c字符串,因此它附加了
“.txt”
下一次迭代引用一个从x[30]开始的c字符串,因此它附加了
“a.txt”
然后
“ta.txt”
等等

total它提供以下字符串,所有字符串均按以下顺序追加:

"t" + "xt" + "txt" + ".txt" + "a.txt" + "ta.txt" + "ata.txt" + "data.txt" + "Fdata.txt" + "BFdata.txt" + "QBFdata.txt"
将最终字符串呈现为:
“txttxt.txta.txtta.txtta.txtdata.txtdata.txtFdata.txtBFdata.txtBFdata.txtQBFdata.txt”

希望这有帮助


快乐编码!:)

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

若要一次追加一个字符,请改用以下方法之一:

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

但是,由于是向后循环,因此需要在字符串前面添加每个字符,而不是在后面添加

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


非常容易使用,如果你有它,或。或及其类。您正在调用的重载接受以null结尾的
常量char*
-了解其工作原理“请不要建议任何替代方案,因为我已经有了解决方案”Pro提示:您可以在此处自行回答问题。
temp.append(&x[i], 1);
temp.push_back(x[i]);
temp += x[i];
temp.insert(0, &x[i], 1);
temp = x[i] + temp;