【问题标题】:<character*> only appends last input using cin<character*> 仅使用 cin 附加最后一个输入
【发布时间】:2016-06-01 13:11:40
【问题描述】:

我通过使用 cin 获取用户输入,使用向量将 char* 存储在数组中。输入是循环接收的,在我显示输入之前一切正常。放入向量中的最后一个元素显示在所有索引中。即,如果我在循环中使用 cin 将字符串 "hello" "world" "this' "is" "C++" 放入。输出为 "C++ " 5 次。

代码如下。

#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;
}

【问题讨论】:

  • 使用 std::string 代替 char*

标签: c++ loops vector


【解决方案1】:

您正在用每个输入覆盖字符串。

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;
}

【讨论】:

    【解决方案2】:
    vec.push_back(str);
    

    您一遍又一遍地将相同的地址放入向量中。

    你需要移动这个:

    char *str=new char[10];
    

    在循环内部。

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

    如 cmets 所述,std::string 可能是更好的选择。

    【讨论】:

    • 有没有我可以在不修改相同地址的情况下添加数据?
    • @Hawk 添加了建议,但最好使用字符串类代替
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2013-04-25
    • 2020-11-09
    • 2017-10-18
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多