1

以下のプログラムが「cin.getline(staffMember, 100);」をスキップする理由がよくわかりません。たとえば、「q」のような区切り記号を追加すると、期待どおりに機能します。改行が自動的に入力されているかのように動作する理由がわかりません。誰かが私になぜこれが起こっているのか説明してもらえますか?

#include "stdafx.h"
#include <iostream>
#include <string>
#include <fstream> // Allow use of the ifstream and ofstream statements
#include <cstdlib> // Allow use of the exit statement

using namespace std;

ifstream inStream;
ofstream outStream;

void showMenu();
void addStaffMember();

void showMenu()
{
    int choice;

    do
    {
        cout 
            << endl
            << "Press 1 to Add a New Staff Member.\n"
            << "Press 2 to Display a Staff Member.\n"
            << "Press 3 to Delete a Staff Member.\n"
            << "Press 4 to Display a Report of All Staff Members.\n"
            << "Press 5 to Exit.\n"
            << endl
            << "Please select an option between 1 and 5: ";

        cin >> choice;

        switch(choice)
        {
            case 1:
                addStaffMember();

                break;
            case 2:
                break;
            case 3:
                break;
            case 4:
                break;
            case 5:
                break;
            default:
                cout << "You did not select an option between 1 and 5. Please try again.\n";
        }
    } while (choice != 5);
}

void addStaffMember()
{
    char staffMember[100];

    cout << "Full Name: ";

    cin.getline(staffMember, 100);

    outStream.open("staffMembers.txt", ios::app);
    if (outStream.fail())
    {
        cout << "Unable to open staffMembers.txt.\n";
        exit(1);
    }

    outStream << endl << staffMember;

    outStream.close();
}

int main()
{
    showMenu();

    return 0;
}
4

4 に答える 4

4

ユーザーが選択肢を入力するときは、数字を入力してから Enter キーを押します。これにより、文字を含む\n入力が入力ストリームに入れられます。すると、が見つかるcin >> choiceまで文字が抽出され、それらの文字は として解釈されます。ただし、はまだストリーム内にあります。\nint\n

後で を実行cin.getline(staffMember, 100)すると、\n実際には何も入力せずに新しい行を入力したかのように表示され、

これを回避するには、以下を使用して次の新しい行まで抽出しignoreます。

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

これにより、次の文字までのすべてが抽出され\n、破棄されます。実際、これは、ユーザーが のようなものを入力した場合でも処理されます1banana1によって抽出されcin >> choice、残りの行は無視されます。

于 2013-04-29T12:00:44.537 に答える
0

cin >> choice;改行を行うときはcin. したがって、getline次に実行すると、この改行まで読み取られ、空の (または空白の) 文字列が返されます。

于 2013-04-29T12:01:13.073 に答える