正如你所看到的,我们使用一个循环来连续循环,直到用户提供有效的输入。如果他们不,我们要求他们再试一次,直到他们给我们有效的输入,关闭程序,或摧毁他们的计算机。
错误案例2:成功的提取,但与外来的输入
考虑下面的程序的执行:
输入一个双值:5 * 7
你认为下一步会发生什么?
输入一个双值:5 * 7
输入以下的一个:+,-,*,或/:输入一个双值:7 * 35是5
该程序打印正确的答案,但格式都搞砸了。让我们仔细看看为什么。
当用户输入“5 * 7”作为输入时,输入到缓冲区中。然后操作>将5个变量提取到变量X,在缓冲区中留下“* 7”。接下来,程序打印“输入以下的一个:+,-,*,或/:”。然而,当提取操作符被调用时,它看到“* 7 \ n”等待在缓冲区中提取,所以它使用,而不是要求更多的输入用户。因此,它提取“*”字符,在缓冲区中留下“7”。
要求用户输入另一个双值后,在缓冲区中的“7”被提取,而不要求用户。由于用户没有机会进入附加数据并回车(引起一个换行符),输出提示都会在同一起跑线,即使输出是正确的。
我们的程序将工作的预期,即使我们进入“5 * 7”的第一个输入- 5将被提取,其余的字符将被删除从输入缓冲区。由于输入缓冲区现在是空的,用户将被正确要求输入下一次的提取操作进行!
错误案例3:提取失败
现在考虑下面的计算器程序的执行:
输入一个双值:一个
你不应该惊讶的程序不执行预期,但它失败是有趣的:
输入一个双值:一个
输入以下的一个:+,-,*,或/:输入一个双值:
程序突然结束。
这看起来非常相似的外部输入的情况下,但它有一点不同。让我们仔细看看。
当用户输入“A”时,该字符被放置在缓冲区中。然后运算符> >试图提取“A”到变量X,这是一个类型的双。既然'一个'不能转换为一个双,操作员> >不能做提取。两件事情发生在这一点上:一个是在缓冲区中,左和std::cin进入“故障模式”。
一旦在“失败模式”,未来的要求输入提取将默默失败。因此,在我们的计算器程序中,输出提示仍然打印,但任何进一步提取的请求都将被忽略。程序只需运行到最后,然后终止(不打印结果,因为我们从来没有在一个有效的数学运算中读取)。
错误案例2:成功的提取,但与外来的输入
考虑下面的程序的执行:
输入一个双值:5 * 7
你认为下一步会发生什么?
输入一个双值:5 * 7
输入以下的一个:+,-,*,或/:输入一个双值:7 * 35是5
该程序打印正确的答案,但格式都搞砸了。让我们仔细看看为什么。
当用户输入“5 * 7”作为输入时,输入到缓冲区中。然后操作>将5个变量提取到变量X,在缓冲区中留下“* 7”。接下来,程序打印“输入以下的一个:+,-,*,或/:”。然而,当提取操作符被调用时,它看到“* 7 \ n”等待在缓冲区中提取,所以它使用,而不是要求更多的输入用户。因此,它提取“*”字符,在缓冲区中留下“7”。
要求用户输入另一个双值后,在缓冲区中的“7”被提取,而不要求用户。由于用户没有机会进入附加数据并回车(引起一个换行符),输出提示都会在同一起跑线,即使输出是正确的。
虽然上面的问题工作,执行是凌乱的。如果简单地忽略了任何外来字符,那将是更好的。幸运的是,这是很容易做的:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
char getOperator()
{
while (1) // 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
}
我们的程序将工作的预期,即使我们进入“5 * 7”的第一个输入- 5将被提取,其余的字符将被删除从输入缓冲区。由于输入缓冲区现在是空的,用户将被正确要求输入下一次的提取操作进行!
错误案例3:提取失败
现在考虑下面的计算器程序的执行:
输入一个双值:一个
你不应该惊讶的程序不执行预期,但它失败是有趣的:
输入一个双值:一个
输入以下的一个:+,-,*,或/:输入一个双值:
程序突然结束。
这看起来非常相似的外部输入的情况下,但它有一点不同。让我们仔细看看。
当用户输入“A”时,该字符被放置在缓冲区中。然后运算符> >试图提取“A”到变量X,这是一个类型的双。既然'一个'不能转换为一个双,操作员> >不能做提取。两件事情发生在这一点上:一个是在缓冲区中,左和std::cin进入“故障模式”。
一旦在“失败模式”,未来的要求输入提取将默默失败。因此,在我们的计算器程序中,输出提示仍然打印,但任何进一步提取的请求都将被忽略。程序只需运行到最后,然后终止(不打印结果,因为我们从来没有在一个有效的数学运算中读取)。