1. ホーム
  2. c++

[解決済み] C++でcin.ignore()を使う必要があるのはいつ、なぜですか?

2022-03-14 15:55:12

質問

C++で、数値と文字列を入力させる非常に基本的なプログラムを書きました。驚いたことに、このプログラムを実行すると、文字列の入力を求めるために停止することがありませんでした。ただ、文字列を読み飛ばしてしまうのです。StackOverflowでいくつか読んだ後、私は次のような行を追加する必要があることを知りました。

cin.ignore(256, '\n');

を、文字列の入力を得る行の前に追加しました。これを追加すると問題が解決し、プログラムが動作するようになりました。私の疑問は、なぜC++ではこの cin.ignore() の行が必要なときを予測するにはどうしたらよいでしょうか? cin.ignore() ?

以下は、私が書いたプログラムです。

#include <iostream>
#include <string>

using namespace std;

int main()
{
    double num;
    string mystr;

    cout << "Please enter a number: " << "\n";
    cin >> num;
    cout << "Your number is: " << num << "\n";
    cin.ignore(256, '\n'); // Why do I need this line?
    cout << "Please enter your name: \n";
    getline (cin, mystr);
    cout << "So your name is " << mystr << "?\n";
    cout << "Have a nice day. \n";

}

解決方法は?

無視とは、その名の通り、無視することです。

不要なものを捨てるわけではなく、呼び出すときに指定した文字数、ブレークポイントとして指定した文字数まで無視します。

入力バッファと出力バッファの両方で動作します。

基本的に std::cin を実行する前にignoreを使用します。 getline の呼び出しは、ユーザーが何かを入力するときに std::cin を選択すると、Enterキーを押して '\n' に文字が入ります。 cin バッファに格納されます。次に、もし getline という文字列の代わりに改行文字が取得されます。そこで std::cin.ignore(1000,'\n') で、これでバッファは希望の文字列までクリアされるはずです。(1000は指定したブレークポイント(この場合は改行文字)の前の特定の文字数をスキップするために付けられたものです)。