[解決済み] 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は指定したブレークポイント(この場合は改行文字)の前の特定の文字数をスキップするために付けられたものです)。
関連
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] static_cast, dynamic_cast, const_cast, reinterpret_cast はいつ使うべきですか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] 仮想デストラクタはいつ使うのか?
-
[解決済み] C++で仮想関数が必要な理由とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++