1

コンソール入力から 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;
}
4

1 に答える 1

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;

私はそれを修正する1つの方法をまとめました。注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;
}
于 2013-03-11T11:48:34.987 に答える