2

ユーザーから文字列と文字の入力を取得する単純なコンソール アプリケーションを C++ で作成しています。簡単にするために、 stringおよびcharデータ型を使用して cin からの入力を渡したいと思います。

文字列入力を取得するために、getlineメソッドを使用しています。

string var;
cin.ignore(); //I used ignore() because it prevents skipping a line after using cin >> var
getline(cin, var);

char 入力を取得するために、cin >> varメソッドを使用しています。

char var;
cin >> var;

これはほとんどの場合うまくいきます。ただし、getlineを使用して文字列を入力すると、文字列の最初の文字が無視されます。

ignoreを使用せずにgetlinecin >>を使用することは可能ですか、または最初の文字がスキップされないようにするために呼び出すことができるメソッドはありますか?

これは、 getlinecin >>の両方を使用するコードの完全なサンプルです。

string firstName;
string lastName;
char gender = 'A';

cout << "First Name: ";
cin.ignore();
getline(cin, firstName);


cout << "Last Name: ";
cin.ignore();
getline(cin, lastName);

while(genderChar != 'M' && genderChar != 'F')
{
    cout << "Gender (M/F): ";
    cin >> genderChar;
    genderChar = toupper(genderChar);
}
4

5 に答える 5

0

したがって、基本的にcin>>var 、'\n' 文字はバッファから除外されます。したがって、getline を呼び出すと、「\n」文字が読み取られて停止します。したがって、cin.ignore() を使用して、getline が読み取る最初の文字、つまり '\n' を cin の後に使用するときに無視します。

しかし、getline は '\n' 文字を残さず、代わりに '\n' 文字が見つかるまですべてをバッファーに格納し、次に '\n' 文字も格納してから停止します。

そのため、コードで getline の後に cin.ignore() を使用し、再度 getline を使用して入力を取得すると、'\n' ではなく文字列の最初の文字が無視されます。そのため、最初の文字が欠落しています。

これがあなたの質問に答えることを願っています。

于 2020-11-04T11:05:21.820 に答える