为什么程序循环而不是要求输入?

时间:2016-10-25 23:11:23

标签: c++ loops if-statement

我目前正在编写一个程序,除了一个选项,然后是一段文本,如果是一段文字。如果文本为真,则执行一段代码?至少我认为它是如何工作的,然而,程序直接进入其他并且保持循环,因为初始条件它不会询问用户的另一个输入是getline()吗? / p>

#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>

using namespace std;

int main() {

    fstream gFile;
    int choice;
    string gb;
    do {
        cout << "Student Grade Book Info Program....\n";
        cout << "\tPlease Select an Option: (1 or 2) \n" << endl
            << "\t1. Review Grades"
            << "\n\t2. Quit"
            << "\n\tChoose: ";
        cin >> choice;

        switch (choice) {

        case 1: 
            cout << "\n\tPlease Enter the Name of the File you wish to View the Grades for: " << endl;
            cout << "\n\tAvailable Grade Books: gradeBook\n" <<
            "\tType in the Grade Book you would like to view. ";

            getline(cin, gb);

            if (gb == "gradeBook") {

                cout << "execute code...";

            }
            else {
                cout << "\nError there is no such entry in the system." << endl;

            }

        case 2:
            break;
        }

    } while (choice != 2);


    return 0;
}

2 个答案:

答案 0 :(得分:1)

cin >> choice;

这将读取输入的数字。但是,在此输入的数字后面会跟一个新行,operator>>将无法读取。

    cout << "\n\tAvailable Grade Books: gradeBook\n" <<
        "\tType in the Grade Book you would like to view. ";

        getline(cin, gb);

getline()现在将读取前一个operator>>遗留的换行符,而不是等待输入下一行输入。

这是一个常见的错误:混合operator>>std::getline()。尽管可以将两者结合使用,但必须采取其他步骤才能正确地执行此操作。读取以换行符结尾的文本行的最简单和最简单的方法是使用std::getline()。这就是它的用途。只需使用std::getline()即可始终阅读文本输入。如果要将其解析为整数或其他内容,请构造std::istringstream并解析它。

答案 1 :(得分:0)

这是因为输入缓冲区仍然包含换行符,因此这会影响你的案例getline中的下一个输入。

将getline与提取运算符混合&#34;&gt;&gt;&#34;正确地只是自己刷新输入缓冲区:

在您的示例中添加:

//cin.sync();  // or
  cin.ignore(1, '\n');

在getline之前添加以上一行,以便您的代码如下所示:

cin.ignore(1, '\n'); // flushing the buffer
getline(cin, gb);