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

当用户输入一个选项时,他们输入一个数字,然后按回车键。这会将包含\n字符的输入放入输入流中。当您这样做时cin >> choice,将提取字符直到\n找到 ,然后这些字符将被解释为int. 但是,\n仍然在流中。

稍后,当您这样做时cin.getline(staffMember, 100),它会读取到\n并且看起来好像您输入了一个新行而没有实际输入任何内容。

要解决此问题,请使用以下命令提取到下一个新行ignore

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

这将提取直到并包括下一个\n字符的所有内容并将其丢弃。所以事实上,当用户输入类似1banana. 将1被提取cin >> choice,然后该行的其余部分将被忽略。

于 2013-04-29T12:00:44.537 回答
0

利用

scanf("%d\n", &choice);

或者你可以在 cin>>choice; 之后使用一个虚拟的 getchar()

现在,\n正如在几个答案中所解释的那样,已跳过。

于 2013-04-29T12:06:57.923 回答
0

当做cin >> choice;换行符时,由cin. 因此,当您执行getline下一步时,它会读取到此换行符并返回空(或空白)字符串。

于 2013-04-29T12:01:13.073 回答
0

cin混合getline()- 尽量不要在同一代码中混合两者。

尝试改用这个?

char aa[100];
// After using cin 
std::cin.ignore(1);
cin.getline(aa, 100);
//.... 
于 2013-04-29T12:31:07.647 回答