考虑下面的程序的执行

正如你所看到的,我们使用一个循环来连续循环,直到用户提供有效的输入。如果他们不,我们要求他们再试一次,直到他们给我们有效的输入,关闭程序,或摧毁他们的计算机。
错误案例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进入“故障模式”。
一旦在“失败模式”,未来的要求输入提取将默默失败。因此,在我们的计算器程序中,输出提示仍然打印,但任何进一步提取的请求都将被忽略。程序只需运行到最后,然后终止(不打印结果,因为我们从来没有在一个有效的数学运算中读取)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值