用户输入结束关闭控制台

User Input To End Close Console

我有一个 do while 循环来保持循环通过我的 int main()。我通过创建一个名为 keepGoing 的 bool 来做到这一点。现在我卡住了按 "q" 或键入 "exit" 来结束程序。

我试过 if (exitCon == 'quit') 然后退出程序。但是我尝试的一切都一直显示错误消息。

#include <iostream>
#include <iomanip>
#include <math.h>
#include <stdexcept>
#include <string>
#include <fstream>



using namespace std; 

//function prototypes 
double DoubleInput(string strQuestion); 
double GradePoint(double &p);


int main() 
{
    const string PCENT = "%";
    bool keepGoing = true;

    cout << "===================================================================" << endl;
    cout << "                         GPA CALCULATOOR                           " << endl;
    cout << "===================================================================" << endl;

    do{
        double input = DoubleInput("\nPlease enter your numeric grade percentage: ");

        double g = GradePoint(input);


        cout << "You entered a grade of " << input << PCENT << endl; 
        cout << input << PCENT << " is equal to " << g << " grade points" << endl;

      }while(keepGoing);   
}

}

这是我顺便获取输入的函数

double DoubleInput(string strQuestion)
    {

        double doubleHolder;

        cout << strQuestion;
        cin >> doubleHolder;


        while(cin.fail())
        {

            cin.clear();
            cin.ignore(10000, '\n');
            cout << "No non-numeric inputs. Please try again!" << endl << endl;
            cout << strQuestion;
            cin >> doubleHolder;
        }


        cout << endl;
        return doubleHolder;
    }

您需要切换布尔变量keepGoing 的值才能退出循环。没有其他确定性的方法来处理这种情况。所以你必须在 while 循环中接收输入并检查它是 'q' 还是 'exit' 并将变量 keepGoing 重置为 false.

您可能正在阅读 DoubleInput 中的输入,现在您有两个选择:

1 不使用那个函数而是做类似的事情:

string str;
getline(cin, str);
if(str == "q" || str == "quit")
  keepGoing = true;
else input = stod(str);

2 使用该函数但返回一个双精度值,您 pre-defined 表示用户想要退出然后检查它的值:

double input = DoubleInput(msg);
if(input == EXIT)
  keepGoing = true;
else doStuff();

DoubleInput 有两个职责:

  1. 阅读double.
  2. 指示用户是否选择输入退出代码。

需要更改函数的接口以提供两者。

如果您可以访问 C++17,一种方法是使用 std::optional

std::optional<double> DoubleInput(string strQuestion);

如果您没有使用 C++17 的选项,您可以使用 std::optional 的穷人版本,方法是:

std::pair<bool, double> DoubleInput(string strQuestion);

如果输入有效,则返回对象的 .first 将设置为 true,如果输入无效,则 false and/or用户选择输入退出代码。

std::pair<bool, double> DoubleInput(string strQuestion)
{
   std::string input;
   double num;

   cout << strQuestion;

   // Read the input to a string.
   while( cin >> input )
   {
      // Check the input agains the exit codes.
      if ( input == "exit" || input == "q")
      {
         return std::make_pair(false, 0.0);
      }

      // Try to extract a number from the input string
      // by using istringstream.
      std::istringstream str(input);
      if ( str >> num )
      {
         return std::make_pair(true, num);
      }

      // If there is an error, try again.
      cin.clear();
      cin.ignore(10000, '\n');
      cout << "Invalid input. Please try again!" << endl << endl;
      cout << strQuestion;
   }

   // If there is nothing left in cin, we come here.
   return std::make_pair(false, 0.0);
}

使用方法如下:

do
{
   std::pair<bool, double> input = DoubleInput("\nPlease enter your numeric grade percentage: ");
   if ( input.first == false )
   {
      break;
   }

   double g = GradePoint(input.second);

   cout << "You entered a grade of " << input.second << PCENT << endl; 
   cout << input << PCENT << " is equal to " << g << " grade points" << endl;

} while(true); 

假设 DoubleInput 仅负责收集有效输入,即在本例中为正 non-zero double 值,您可以实现类似这样的操作。我称它为 getDoubleInput 因为我对用大写字母命名函数有这种奇怪的 hang-up 。您还应该始终将字符串作为引用传递,如果您不修改它们,则应传递常量。

double getDoubleInput(const std::string& prompt)
{
    double input(0.0);
    do
    {
        std::cout << prompt;
        while (!(std::cin >> input))
        {
            std::cout << "Please enter a positive number: ";
            std::cin.clear();
            std::cin.ignore(1024, '\n');
        }
    }
    while (input <= 0.0);

    return input;
}