Getlineメソッドを使用して、ユーザーが入力したメッセージを取得するのに問題があります。次のようなものを使用しています。
string messageVar;
cout << "Type your message: ";
getline(cin, messageVar);
ただし、出力値を取得するのは停止していませんが、これの何が問題になっていますか?
cin >> something
の後にgetline()
を使用している場合は、間にあるバッファーから改行文字をフラッシュする必要があります。 cin.ignore()
を使用して実行できます。
次のようなものになります。
string messageVar;
cout << "Type your message: ";
cin.ignore();
getline(cin, messageVar);
これは、>>
演算子が入力バッファに改行\n
文字を残すために発生します。これは、改行文字が見つかるまで入力を読み取るgetline()
などのフォーマットされていない入力を行うと問題になる場合があります。これは、前の操作でそこにぶら下がっていた\n
のため、すぐに読み取りを停止します。
入力に改行が1つしかない場合は、
std::cin.ignore();
正常に動作します。入力から次の文字を読み取り、破棄します。
ただし、改行以外に入力にまだ何かがある場合(たとえば、1つのWordを読んで、ユーザーが2つの単語を入力した場合)、次のようにする必要があります。
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
例参照 このignore
関数の参照 。
さらに安全にするには、 gcount
がゼロを返すまで、ループで上記の2番目の選択肢を実行します。
同様の問題がありました。 1つの欠点は、cin.ignore()を使用すると、プログラムを台無しにするもう1回Enterキーを押す必要があることです。
int main(){
.... example with file
//input is a file
if(input.is_open()){
cin.ignore(1,'\n'); //it ignores everything after new line
cin.getline(buffer,255); // save it in buffer
input<<buffer; //save it in input(it's a file)
input.close();
}
}