[解決済み] c++ getline() が複数回呼ばれたときに、コンソールからの入力を待たない。
質問
コンソールから、2つの文字列、2つのint、1つのdoubleという、いくつかのユーザー入力パラメータを取得しようとしています。私が使おうとしている関連するコードは、以下の通りです。
#include <string>
#include <iostream>
using namespace std;
// ...
string inputString;
unsigned int inputUInt;
double inputDouble;
// ...
cout << "Title: ";
getline(cin, inputString);
tempDVD.setTitle(inputString);
cout << "Category: ";
getline(cin, inputString);
tempDVD.setCategory(inputString);
cout << "Duration (minutes): ";
cin >> inputUInt;
tempDVD.setDuration(inputUInt);
cout << "Year: ";
cin >> inputUInt;
tempDVD.setYear(inputUInt);
cout << "Price: $";
cin >> inputDouble;
tempDVD.setPrice(inputDouble);
しかし、プログラムを実行すると、最初の inputString の入力を待つのではなく、2回目の getline() の呼び出しまでコードが止まりません。したがって、コンソール出力は次のようになります。
タイトル カテゴリ
で、categoryの後にカーソルが表示されます。今入力すると、年入力にジャンプしてしまい、複数の文字列を入力することができません。何が起こっているのでしょうか?
解決方法は?
getline()の呼び出しと演算子 >>の使用が混在していることが問題です。
演算子 >>は、先頭の空白を無視するので、行の境界を越えて正しく続行することを覚えておいてください。しかし、入力の取得に成功した後は読み込みを停止するため、末尾の '\n' 文字を飲み込むことはありません。したがって、>> の後に getline() を使用すると、(読み込まれなかった '\n' 文字を最初に削除する) 注意を払わないと、通常は間違った結果を得ることになります。
コツは、両方の入力を使わないことです。適切な方を選んで、それに徹することです。
もし、すべて数字(または、operator >>と相性の良いオブジェクト)なら、operator >>を使ってください(文字列は、入出力と対称でない(つまり相性の良くない)唯一の基本型であることに注意してください)。
入力に文字列や、getline()を必要とするような組み合わせが含まれている場合は、getline()のみを使用し、文字列から数字をパースしてください。
std::getline(std::cin, line);
std::stringstream linestream(line);
int value;
linestream >> value;
// Or if you have boost:
std::getline(std::cin, line);
int value = boost::lexical_cast<int>(line);
関連
-
[解決済み】構造体のベクター初期化について
-
[解決済み】coutはstdのメンバではない
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?