现在,考虑无效的用户输入可能会打破这个程序。
首先,我们要求用户输入一些数字。如果他们输入的东西以外的数字(例如“Q”)呢?在这种情况下,提取将失败。
第二,我们要求用户输入四个可能的符号之一。如果他们输入的字符以外的符号之一,我们的期望呢?我们将能够提取输入,但我们目前不处理发生什么事后。
第三,如果我们要求用户输入一个符号,他们输入一个字符串,如“*你好”。尽管我们可以提取我们需要的“*”字符,但是缓冲区中还有额外的输入,这可能会导致道路上的问题。
无效文本输入的类型
我们通常可以将输入的文本错误分成四种类型:
输入提取成功,但输入是没有意义的程序(如进入' K '作为您的数学运算符)。
输入提取成功,但用户进入额外的输入(例如输入'你好你好'作为您的数学运算符)。
输入提取成功,但用户溢出数值。
输入提取失败(例如试图输入Q到数字输入)。
因此,为了使我们的程序健壮,每当我们要求用户输入时,我们最好确定是否上述的每一个可能发生,如果是的话,写代码来处理这些情况。
让我们深入研究每一种情况,以及如何使用STD。
错误案例1:提取成功,但输入是没有意义的
这是最简单的情况。考虑以下程序的执行:
输入双值:5
输入下列内容之一:+,-,*,/或:K
输入双值:7
在这种情况下,我们要求用户输入四个符号中的一个,但他们输入了“k”代替。' K '是一个有效的字符,所以性病::CIN高兴地提取到变量OP,这将返回到主。但我们的程序不希望这种情况发生,所以它不妥善处理这种情况下(因此从来没有输出任何东西)。
这里的解决办法很简单:做输入验证。这通常包括3个步骤:
1)检查用户输入是否是你所期望的。
2)如果是这样,返回值给用户。
3)如果没有,告诉用户出错了,让他们再试一次。
首先,我们要求用户输入一些数字。如果他们输入的东西以外的数字(例如“Q”)呢?在这种情况下,提取将失败。
第二,我们要求用户输入四个可能的符号之一。如果他们输入的字符以外的符号之一,我们的期望呢?我们将能够提取输入,但我们目前不处理发生什么事后。
第三,如果我们要求用户输入一个符号,他们输入一个字符串,如“*你好”。尽管我们可以提取我们需要的“*”字符,但是缓冲区中还有额外的输入,这可能会导致道路上的问题。
无效文本输入的类型
我们通常可以将输入的文本错误分成四种类型:
输入提取成功,但输入是没有意义的程序(如进入' K '作为您的数学运算符)。
输入提取成功,但用户进入额外的输入(例如输入'你好你好'作为您的数学运算符)。
输入提取成功,但用户溢出数值。
输入提取失败(例如试图输入Q到数字输入)。
因此,为了使我们的程序健壮,每当我们要求用户输入时,我们最好确定是否上述的每一个可能发生,如果是的话,写代码来处理这些情况。
让我们深入研究每一种情况,以及如何使用STD。
错误案例1:提取成功,但输入是没有意义的
这是最简单的情况。考虑以下程序的执行:
输入双值:5
输入下列内容之一:+,-,*,/或:K
输入双值:7
在这种情况下,我们要求用户输入四个符号中的一个,但他们输入了“k”代替。' K '是一个有效的字符,所以性病::CIN高兴地提取到变量OP,这将返回到主。但我们的程序不希望这种情况发生,所以它不妥善处理这种情况下(因此从来没有输出任何东西)。
这里的解决办法很简单:做输入验证。这通常包括3个步骤:
1)检查用户输入是否是你所期望的。
2)如果是这样,返回值给用户。
3)如果没有,告诉用户出错了,让他们再试一次。
这是一个更新的getoperator()功能,并输入验证。
2
3
4
5
6
7
8
9
10
11
12
13
14
15
char getOperator()
{
while (true) // Loop until user enters a valid input
{
std::cout << "Enter one of the following: +, -, *, or /: ";
char op;
std::cin >> op;
// Check whether the user entered meaningful input
if (op == '+' || op == '-' || op == '*' || op == '/')
return op; // return it to the caller
else // otherwise tell the user what went wrong
std::cout << "Oops, that input is invalid. Please try again.\n";
} // and try again
}