我有以下代码,出于某种原因,当我尝试使用for loop
来string attribs
来声明string wholecommand
时,attribs.length()
会返回0
和< / p>
当我尝试:
cout<<attribs;
它什么也没输出。
for(int q=0;q<wholecommand.length();q++){
cout<<atrribs[q];
}
上面的代码是我获得输出的唯一方法。我的代码有什么问题,如何在不使用for循环的情况下输出数据?
#include<iostream>
#include<string>
using namespace std;
int main(){
string wholecommand="apple";
string atrribs;
for(int a=0;a<wholecommand.length();a++){
atrribs[a]= wholecommand[a];
}
cout<<"Content of Wholecommand: "<<wholecommand<<endl; //returns apple
cout<<"Length of Wholecommand: "<<wholecommand.length()<<endl; //returns 5
cout<<"Content of attributes: "<<atrribs<<endl; ////////contains nothing
cout<<"Length of attributes: "<<atrribs.length()<<endl; ////////returns 0
system("pause");
}
答案 0 :(得分:2)
放一个
atrribs.resize(wholecommand.length());
在for()
循环之前以使其正常工作
您无法通过std::string
索引分配值,其中目标字符串未调整大小以匹配它们。
虽然这是值得怀疑的,但代码示例的目的是什么呢?你可以通过
简单地实现同样的目标atrribs = wholecommand;
没有for()
循环。
答案 1 :(得分:1)
attribs构造为长度为0的字符串;这就是默认的ctor所做的。当然,当您打印长度为0的字符串时,不显示任何内容。 (即使您遇到了引用超过该大小的索引的元素的问题。)
为了使其表现出来,请确保它足够长:要么将它设置为足够大的东西(attrib = wholeCommand
- 然后你就完成了!);或者调整它的大小;或者用ctor调用它以使其足够大(string attrib (5, 'x'); // gives it 5 copies of x
)。
正如Paul在上面指出的那样:你可以只是说字符串attrib = wholeCommand;并完成它。
答案 2 :(得分:0)
您可以执行以下操作:
string atrribs(wholecommand.length(), 0);
从字符串构造函数的version six开始,此字符串构造函数将要填充的连续字符数作为第一个参数,并将第二个参数作为要填充的字符。在此示例中,atrribs连续五次填充空字符(0)。我可以在这个例子中使用任何字符。
答案 3 :(得分:0)
在这个问题的第一个答案中,建议使用resize()作为解决方案。
考虑到代码模式,假设这是你真正想做的事情,resize()会增加一些浪费的工作。你正在覆盖attribs中的每个位置。在这种情况下,通过调整字符串和默认构造元素来调整大小所做的工作是没用的。
attribs.reserve()可能会更好。当然,你不能再使用“[a] =”了。