c++ getline() は複数回呼び出されてもコンソールからの入力を待機しません [重複] 質問する

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() 呼び出しまでコードが停止しません。そのため、コンソール出力は次のようになります。

タイトル: カテゴリー:

カーソルはカテゴリーの後に表示されます。ここで入力すると、プログラムは年の入力にジャンプし、複数の文字列を入力できなくなります。これは何が起きているのでしょうか?

ベストアンサー1

問題は、getline() の呼び出しと演算子 >> の使用を混在させていることです。

演算子 >> は先頭の空白を無視するため、行の境界を越えて正しく続行されることを覚えておいてください。ただし、入力が正常に取得された後に読み取りを停止するため、末尾の '\n' 文字は無視されません。したがって、>> の後に getline() を使用すると、注意しないと (読み取られなかった '\n' 文字を最初に削除するなど)、通常は間違った結果になります。

コツは、両方のタイプの入力を使用しないことです。適切な方を選択して、それに固執してください。

すべて数値 (または演算子 >> とうまく連携するオブジェクト) の場合は、演算子 >> を使用します (文字列は、入力/出力と対称ではない (つまり、うまく連携しない) 唯一の基本型であることに注意してください)。

入力に ​​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);

おすすめ記事