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

getline() not filling the whole string array

本文关键字:字符串 数组 填充 getline      更新时间:2023-10-16

我写这段代码是为了从控制台输入中读取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;
}

假设您的输入如下:

2n
line 0n
line 1n

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

n
line 0n
line 1n

使用>>只读取它感兴趣的比特(即int(,然后在流上留下任何其他东西(在这种情况下,只有n,但仔细想想,线上可能有各种各样的东西(。getline读取直到n的所有内容,然后从流中删除n。因此,在第一个getline之后,剩余的输入是:

line 0n
line 1n

并且CCD_ 9包含CCD_。

然后在下一个getline:之后

remaining input:
line 1n

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