C ++ cin.getline似乎被跳过了

时间:2013-04-29 11:54:42

标签: c++

我无法弄清楚为什么我的程序会跳过“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 个答案:

答案 0 :(得分:4)

当用户输入选项时,他们键入一个数字,然后按Enter键。这会将包含\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提取,然后该行的其余部分将被忽略。

答案 1 :(得分:0)

执行cin >> choice;时,新行由cin保留。因此,当您接下来执行getline时,它将读取此换行符并返回空(或空格)字符串。

答案 2 :(得分:0)

使用

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

或者您可以在cin&gt;&gt; choice;

之后使用虚拟getchar()

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

答案 3 :(得分:0)

cingetline()混合在一起 - 尽量不要在同一代码中混用。

尝试使用它吗?

char aa[100];
// After using cin 
std::cin.ignore(1);
cin.getline(aa, 100);
//....