2016-02-19 70 views
-1

我正在使用向量来将char*存储在数组中,方法是使用cin获取用户输入。输入被循环接收,一切正常,直到我显示输入。放在向量中的最后一个元素显示在所有的索引中.ie.if如果我在循环中使用cin将字符串“hello”“world”“this”“是”C++“,输出为”C++ “5倍。<character*>只能追加使用cin的最后一个输入

的代码如下。

#include <iostream> 
#include <vector> 

using namespace std; 

int main() 
{ 
    char *str=new char[10]; 
    vector<char*> vec; 
    int i=0; 

    for(i=0; i<5; i++) 
    { 
     cout<<"Enter string: "; 
     cin>>str; 
     vec.push_back(str); 
    } 

    for(i=0; i<5; i++) 
    { 
     cout<<vec[i]<<" "; 
    } 

    return 0; 
} 

Screenshot of the code when ran

+3

使用的std :: string代替字符* –

回答

2

您将覆盖每个输入的字符串。

char *str=new char[10]; 

创建一个c样式的字符串。然后

cin>>str; 

填充它的内容。当你这样做时

vec.push_back(str); 

你复制一个指向该字符串的指针并将其放入向量中。然后,当您再次循环时,它将用您接下来输入的内容覆盖str。由于所有的矢量元素仍然指向相同的字符串,它们都将具有相同的数据。

你需要什么是std::string,然后你可以使用

int main() 
{ 
    std::string str; 
    vector<std::string> vec; 
    int i=0; 

    for(i=0; i<5; i++) 
    { 
     cout<<"Enter string: "; 
     cin>>str; 
     vec.push_back(str); 
    } 

    for(i=0; i<5; i++) 
    { 
     cout<<vec[i]<<" "; 
    } 

    return 0; 
} 
+0

谢谢你,这也工作.. – Hawk

2
vec.push_back(str); 

你一遍又一遍地把相同的地址矢量。

你将需要移动这个:

char *str=new char[10]; 

里面的循环。

然后不要忘记在每个向量元素上调用delete

正如评论中所述,std::string可能是更好的选择。

+0

有反正我可以在不修改同一地址添加数据? – Hawk

+0

@Hawk增加了建议,但你最好使用字符串类,而不是 –

+0

谢谢,它实际上工作,我会尽快接受你的答案.. – Hawk