【问题标题】:Why is the program looping instead of it asking for input?为什么程序循环而不是要求输入?
【发布时间】:2017-03-08 03:58:43
【问题描述】:

我目前正在编写一个程序,它需要除了一个选项,然后是一段文本,如果是一段文本。如果文本为真,则执行一段代码?至少我认为它是这样工作的,但是,程序直接进入 else 并继续循环,因为初始条件它没有询问用户的另一个输入,即 getline() ?

#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;
}

【问题讨论】:

    标签: c++ loops if-statement


    【解决方案1】:

    这是因为输入缓冲区仍然包含换行符,因此这将影响您的情况下的下一个输入 getline。

    要正确混合 getline 和提取运算符“>>”,只需自己刷新输入缓冲区:

    在您的示例中添加:

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

    在 getline 之前添加上述行之一,这样您的代码将如下所示:

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

    【讨论】:

      【解决方案2】:
      cin >> choice;
      

      这将读取输入的数字。但是,在此处输入的数字后面会跟一个换行符,operator&gt;&gt; 不会读取。

          cout << "\n\tAvailable Grade Books: gradeBook\n" <<
              "\tType in the Grade Book you would like to view. ";
      
              getline(cin, gb);
      

      这个getline() 现在将读取从之前的operator&gt;&gt; 留下的换行符,而不是等待输入下一行。

      这是一个常见的错误:混合使用 operator&gt;&gt;std::getline()。虽然可以同时使用两者,但必须采取额外的步骤才能正确地做到这一点。阅读以换行符结尾的文本行的最简单和最简单的方法是使用std::getline()。这就是它的用途。只需使用std::getline() 即可始终读取文本输入。如果你想把它解析为一个整数,或者别的什么,构造一个std::istringstream,然后解析它。

      【讨论】:

      • 啊,我明白了!有效!太棒了,非常感谢。
      • 解释很好,但解决方案到目前为止无关紧要。不,这不是一个好的解决方案,因此您将 getline 的使用限制在提取运算符之前! 'cin.flush()' 和 'cin.sync()' 和 'cin.ignore()' 的作用是什么?
      • 我知道使用命名空间,但 std::getline 并不能解决上述问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-31
      • 1970-01-01
      • 2023-03-25
      相关资源
      最近更新 更多