用户输入结束关闭控制台
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
有两个职责:
- 阅读
double
.
- 指示用户是否选择输入退出代码。
需要更改函数的接口以提供两者。
如果您可以访问 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;
}
我有一个 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
有两个职责:
- 阅读
double
. - 指示用户是否选择输入退出代码。
需要更改函数的接口以提供两者。
如果您可以访问 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;
}