【问题标题】:Not able to input strings using getline() .It is reading only one string无法使用 getline() 输入字符串。它只读取一个字符串
【发布时间】:2017-12-28 22:32:53
【问题描述】:
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 输入字符串的好方法吗?

【问题讨论】:

  • 你有一个指针数组,但是指针实际上在哪里point?
  • 使用 std::vector 和 std::string。没有人有时间指点。

标签: c++ string getline


【解决方案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;
}

【讨论】:

  • for 循环会比while 循环更好吗?
  • @Ed Heal,感谢您指出我的粗略编码。我会做得更好。
【解决方案2】:

我猜你需要阅读更多关于 C++ 中的指针、数组和内存管理的内容。您尝试对 C 字符串数组进行操作,但没有正确初始化它。您需要在使用此类指针之前分配内存。目前你的程序结果是 UB,所以你真的很幸运它做了同样的事情。

另一个问题是,当您到达输入末尾时,当 j=4 时,您仍会尝试执行 cin(getline(name[j], 80) 但您将 name[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;
}

【讨论】:

  • 你能推荐一些资源来加强 c++ 的这个领域吗@kirsz
  • 变量名同时使用单数和复数并不是一个好主意。很容易犯错误。也许list_of_names?
【解决方案3】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-05
    • 2017-03-31
    • 2014-03-26
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多