无法使用getline()输入字符串。它只读取一个字符串

时间:2017-07-23 05:50:10

标签: c++ string getline

char* name[4];
int j=0;
while(cin.getline(name[j],80))//input given:you(ent)me(ent)he(ent)she
    cout<<name[j++];

这段代码只读取一个字符串直到一个换行符。它不会读取所有4个字符串并打印它们吗?这是使用getline输入字符串的好方法吗?

3 个答案:

答案 0 :(得分:4)

问题:您没有正确分配内存。您正在声明一个指针数组,而不是c样式字符串数组。

可能的解决方案:您需要先阅读指针和内存分配。您可以使用以下代码首先将内存分配给您声明为name[0]name[1]name[2]name[3]的四个指针中的每一个:

char* name[4];
for (int i = 0; i < 4; i++)
{
    name[i] = new char[80];
}

或者您可以使用下面发布代码的2D数组:

char name[4][80];
int j=0; 
while(j<4 && cin.getline(name[j],80))
{
    cout<<name[j++];
}

答案 1 :(得分:1)

我做了一些修正。它可以在我的电脑上运行。

char* name[4];
for (int i = 0; i < 4; i++)
    name[i] = new char[80];
int j = 0;
while (j < 4)
{
    cin.getline(name[j], 80); //input given:you(ent)me(ent)he(ent)she
    cout << name[j++] << endl;
}

答案 2 :(得分:1)

我猜你需要阅读更多关于C ++指针,数组和内存管理的内容。您尝试对C字符串数组进行操作,但未正确初始化它。在使用这些指针之前,需要分配内存。目前你的课程成绩为UB,所以你真的很幸运,它做了同样的事情。

另一个问题是,当你到达输入的末尾时,当j = 4时,你仍然会尝试执行cin(getline(name[j], 80),但是你将名称[4]作为参数传递,这可能是一个即使您事先正确分配了内存,也会导致另一个UB的原因。

除此之外,您正在使用C ++编写,因此请使用C ++字符串和向量而不是C数组。

使用字符串和std :: getline:

可以轻松完成
#include <iostream>
#include <vector>
using namespace std;

int main(){
    vector<string> names;
    string name;
    while(getline(cin, name)){
        names.push_back(name);
        cout<<name<<endl;
    }
    return 0;
}