getline()没有填充整个字符串数组

时间:2013-03-11 11:28:12

标签: c++ visual-c++

我编写了这段代码来从控制台输入读取N行并将其放入字符串数组中,但它是 阅读N-1行 有什么建议吗?

#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;

int main()
{
int test;
cin>>test;
string *cases=new string[test];
for(int i=0;i<test;i++)
{
    getline(cin,cases[i],'\n');
}

for(int i=0;i<test;i++)
{
    cout<<cases[i]<<endl;
}

system("pause");
return 0;
}

1 个答案:

答案 0 :(得分:3)

让我们说你的输入是这样的:

2\n
line 0\n
line 1\n

然后在cin>>test之后,顶部有一个空行:

\n
line 0\n
line 1\n

使用>>只读取它感兴趣的位(即int),然后在流上留下任何其他内容(在这种情况下,只是\n但是想一想,可能会有各种各样的东西在线上)。 getline会读取\n 之前的所有内容,然后从流中删除\n 。 所以在第一个getline之后,剩下的输入是:

line 0\n
line 1\n

cases[0]包含""(即空字符串)。

然后在下一个getline

之后
remaining input:
line 1\n

cases[0]: ""
cases[1]: "line 0"

然后循环停止,因为它已读取2行。 那是错的。修复它是另一回事。我更喜欢避免混合>>getline。但是你可以做一些事情来清除流中的\n尾随。

编辑:您也可以阅读std::vector(该文档可能有点技术性 - 搜索教程)以及using namespace std;的邪恶

我把一种解决方法放在一起。注意stoi仅限c ++ 11。如果您没有,stringstream >>atoi

#include <iostream>
#include <vector>
#include <string>
int main()
{
    int inLines = 0;
    //std::cin >> inLines;
    std::string countLine;
    std::getline(std::cin, countLine);
    try
    {
        inLines = std::stoi(countLine);
    }
    catch (...)
    {
        std::cout << "First line must be an integer\n";
        return 1;
    }
    std::vector<std::string> lines(inLines);

    for (int i = 0; i < inLines; ++i)
    {
        std::getline(std::cin, lines[i]);
    }

    for ( auto & s : lines )
    {
        std::cout << s << '\n';
    }
    return 0;
}