for循环中的c ++字符串使长度为0

时间:2014-11-21 04:00:59

标签: c++ string loops for-loop iostream

我有以下代码,出于某种原因,当我尝试使用for loopstring 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");
}

4 个答案:

答案 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] =”了。