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;