0

よし、少し練習していたら、今まで経験したことのない問題にぶつかった。

#include <iostream>

using namespace std;

int main()
{
string empname = "";
int empage = 0;
char yes = 'y';

cout << "Please enter employee name:" << endl;
cin >> empname;
cin.get();
cout << "Your name is " + empname + " is this correct? (yes/no):" << endl;

if (yes)
{
    cout << "good" << endl;
}
else
{
    cout << "Please try again" << endl;
}

cout << "Please enter employee age:" << endl;
cin >> empage;
cin.get();
cout << "Your age is " + empname + " is this correct? (yes/no):" << endl;
if (yes)
{
    cout << "good" << endl;
}
else
{
    cout << "Please try again" << endl;
}
}

これはコンソール プログラムとして実行されますが、11 行目 [空白を含める] (cout << "従業員名を入力してください:\t" << endl;) の後では、すべてをスキップして、Enter キーを押して続行するように指示します。私は何を間違っていますか。

4

2 に答える 2

7

この「続行するには ENTER を押してください」という部分は、コードに含まれていないため、環境 (バッチ スクリプト、エディターなど) からのものであると想定しています。

問題は、cin (一般的には istream) が改行だけでなく、すべての空白で入力を区切ることです。したがってcin >> empname、実際には従業員名の最初のスペースまでの部分、つまり名のみが格納されます。cin.get()1 文字しか取得しないため、改行が表示されるのを待ちません。

std::getline入力の行全体を取得するには、代わりに (in <string>) を使用する必要があります。

例:

string empname = "";
cout << "Please enter employee name:" << endl;
getline(cin, empname);
于 2012-08-21T05:28:36.957 に答える
0

cin と cin.get() を同時に使用しています。neoneo が正しく指摘したように、ここでは getline を使用することをお勧めします。それとは別に、フォーマットされた入力とフォーマットされていない入力を連続して使用すると、この種のエラーが発生することをお知らせします (cin はフォーマットされ、cin.get と getline はフォーマットされていないことを思い出してください)。これは、フォーマットされた入力がストリームからスペースまたは終了文字を削除するためです。その文字はストリームに残り、次にフォーマットされていない入力を試みると、その文字はストリームと変数に入ります。

この文字が入り込むのを避けるために、書式付き入力と書式なし入力の間で cin.clear () または cin.ingore() を使用できます。それが役立つことを願っています

于 2012-08-21T06:41:38.940 に答える