1

ここに投稿するのはこれが初めてなので、質問を明確にしようと思います。したがって、変数にスペースを含む別の文字列を格納する必要があります。私はEclipseで作業していますが、問題があります。

これがコードです

using namespace std;
string p_theme;   
string p_titre;
int p_anneeEdition;
string p_pays;
string p_auteur;
string p_editeur;
string p_isbn;

cout << "Veuillez saisir le thème:" << endl;
getline(cin, p_theme, '\n');


cout << "Veuillez saisir le titre:" << endl;
getline(cin, p_titre, '\n');

....

これは、コンソールが私に表示するものです

Veuillez saisir le thème:
Veuillez saisir le titre:

問題は、2 回目のカウントの前に文字列「テーマ」を入力する時間がないことです。別の方法を試しましたが、char バッファーでは機能せず、ループに入りました。

4

1 に答える 1

3

何もしないAgetlineには多くの理由があります

  • フェイルビットが設定されました(intまたは同様のものの読み取りが失敗したため)。この場合、cinから読み取るためのすべての呼び出しは無視されます。
  • 入力バッファに未読の文字が残っています。たとえば、「\ n」(std::stringwithを読んだ場合などoperator>>)。

両方のケースを処理するには、

cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n'); 

getlineを呼び出す前に(そして#include <limits>ファイルの先頭に追加します)。

これは確かにやり過ぎであり、注意すればこれを減らすことができます。

  • 成功した場合は各入力を確認します(のようにint i; if (std::cin >> i) { /* ok */ }
  • 後で呼び出す場合を除いて、(たとえば)std::stringなしで読まないでください。getlineoperator>>cin.ignore(...)

これをすべて行うと、コードは既に持っているとおりに機能するはずです。

于 2013-02-21T21:49:05.700 に答える