6

標準入力から読み取ろうとしていました。最初の行は、読み取る行数です。次に読んだセリフがまた印刷されます。コードは次のとおりです。

#include <iostream>

using namespace std;

int main()
{
    int n;
    cin >> n;
    for (unsigned int i = 0; i < n; ++i)
    {
        char a[10];
        cin.get (a, 10);
        cout << "String: " << a << endl;
    }
    return 0;
}

実行して行数を指定すると、プログラムが終了します。よく分からなかったので、こちらで質問することにしました。

前もって感謝します。

4

3 に答える 3

6

フォーマットされた入力とフォーマットされていない入力を混在させると、問題が発生します。あなたの特定のケースでは、この行:

std::cin >> n;

入力した数値を消費しますが'\n'、入力ストリームには残します。

続いて、この行:

cin.get (a, 10);

はデータを消費しません (入力ストリームがまだ を指しているため'\n')。次の呼び出しも、同じ理由でデータを消費しません。

質問は、「どのように消費するの'\n'ですか?」になります。いくつかの方法があります。

1文字読んで捨てることができます:

cin.get();

長さに関係なく、1 行全体を読み取ることができます。

std::getline(std::cin, some_string_variable);

現在の行の残りは無視できます。

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

関連するちょっとしたアドバイスとして、私は決して使用しませんstd::istream::get(char*, streamsize)。私はいつも好む: std::getline(std::istream&, std::string&).

于 2013-02-27T20:53:11.033 に答える
2

cin.get()beforeを追加するcin.get(a, 10)と、入力ストリームの残りのエンドラインが読み取られるため、問題が解決します。

于 2013-02-27T20:53:18.920 に答える
1

cin を使用している場合は、これを知っておくことが重要だと思います: http://www.cplusplus.com/forum/articles/6046/

于 2013-02-27T20:51:12.453 に答える