我有一个文件存储路径的字符串,我正在做一些字符串处理,为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
答案 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;