コンソールからいくつかのユーザー入力パラメータ (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);