2016-05-21 8 views
-2

私は多くのオブジェクトを保持する配列であるデータベースクラスを持っています。私は、コードを実行すると、私は最後の名前を入力した後エンターキーを押した後、それはちょうど、文字列とintのユーザー入力を取得するにはどうすればよいですか?

std::cout << "Enter first name: "; 
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
std::getline(std::cin, first_name); 
std::cout << "Enter last name: "; 
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
std::getline(std::cin, last_name); 
std::cout << "Enter age: "; 
std::cin >> age; 

: 機能は、例えば、両方の文字列とint型

が含まれ、ユーザからの入力のカップルがかかります新しい行を開始し、年齢入力を求める前に別の入力を入力する必要があります。

getlineとcinを混ぜるのが悪いと聞きました。どちらか一方を使用する方が良いと聞きました。この仕事をするために私は何ができますか?また、何が良い練習になるでしょうか?

編集:ソリューションを最初に検索したときに無視して追加しましたが、コードがなければユーザー入力を待たずに済みます。出力は「姓を入力:姓を入力:」

Edit2:解決済みです。問題は、ユーザーがint変数を入力するために私のコードで "cin >>"を使用していて、最初のcin.ignoreステートメントが必要でしたが、もう一方は必要ではありませんでした。私はそれがそれに影響しているのか分からなかったので、コードのその部分を含めなかった。まだこのすべてに新しいので、誰も彼らの助けをありがとう!私はignore機能を削除することをお勧めします

+0

'std :: getline()'がすでに次の行に移動しているので、 'ignore'行を削除してください。 – Galik

+0

あなたが何をしているのか分からないのは悪いことです。 「無視する」とは何ですか? – LogicStuff

+0

好奇心から、なぜあなたは 'getline'の前に入力を無視していますか?プログラムがデータを入力する前に、ユーザーが強制的に空白行を入力するように見えます。 –

答えて

1

std::basic_istream::ignore()の文書によると、この関数は、それがブロックに行くと、ユーザの入力を待つれるわけ書式なし入力機能として振る舞いますバッファ内をスキップするものがない場合

std::getline()は、バッファに新しい行文字を残さないため、両方のignore文が必要ではありません。だから、実際に何が起こっているかです:あなたはこの仕事をするためにignoreたstatmentsを削除する必要が

std::cout << "Enter first name: "; 
/*your first input is skipped by the next ignore line because its going to block until 
input is provided since there is nothing to skip in the buffer*/ 
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
/* the next getline waits for input, reads a line from the buffer and also removes the 
new line character from the buffer*/ 
std::getline(std::cin, first_name); 

std::cout << "Enter last name: "; 
/*your second input is skipped by the next ignore line because its going to block until 
input is provided since there is nothing to skip in the buffer*/ 
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
/* the next getline waits for input and this is why it seems you need to provide 
another input before it ask you to enter the age*/ 
std::getline(std::cin, last_name); 

。あなたも読むことがありますWhen and why do I need to use cin.ignore() in C++

1

コール:

std::string name; 
std::cout << "Enter name: "; 
std::getline(cin, name); 
unsigned int age; 
std::cout << "Enter age: "; 
std::cin >> age; 
+0

私は最初は無視していませんでしたが、出力を得ることができました。 "名字を入力:姓を入力してください:"私はいくつかの解決策を見て、それが私が遭遇したものです。 – ptu27

2

あなたのstd::cin::ignoreコールはあなたを助けていません。それらは、行末文字(>>)を抽出しない入力の後にのみ必要です。

std::string first_name; 
std::string last_name; 
int age; 

std::cout << "Enter first name: "; 
std::getline(std::cin, first_name); // end of line is removed 

std::cout << "Enter last name: "; 
std::getline(std::cin, last_name); // end of line is removed 

std::cout << "Enter age: "; 
std::cin >> age; // doesn't remove end of line 
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // this does 
// input can proceed as normal 

std::getline呼び出しを行うのに対し、それは行末文字を削除していないので、あなただけのstd::cin >> age;std::cin::ignoreコールを必要としています。

+0

無視された行を削除すると、コンソールの出力は「Enter first name:」から「Enter last name:」にまっすぐ移動するので、ユーザー入力を許可する前に出力に「Enter first name:Enter last name:」と表示されます – ptu27

+0

@ ptu27 Do表示された前に入力操作を実行する他のコードがありますか? –

+0

@bkVnetはい。私はintのユーザー入力を持っています。プログラムはオプションのリストを出力し、ユーザはstd :: cin経由でどのオプションを選択するかintを入力します – ptu27

関連する問題