循环无限时进行输入验证

时间:2019-01-21 18:13:01

标签: c++ while-loop infinite

#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{

double addition;
double subtraction;
double top, bottom;
double multiplication, multiplication2;
char variable;
double total = 0.0;



    cout << "Type in:\n'A' For Addition\n"
        << "'S' For subtraction\n" << "'D' For division\n"
        << "'M' For multiplication\n";
    cin >> variable;

    switch (variable)
    {
    case 'A':
    {
        cout << "Enter 0 for input\n";
        cin >> addition;
        while(addition != 'Q' || addition != 'q')
        {

            cout << "Enter numbers for adding\nThen type in"
                << "Q or q to quit\n";
            cin >> addition;
            total += addition;

        }
        cout << "Your total is " << total << endl;

    }

它从while循环的第一个cout语句开始无限循环。我将输入数字,然后一旦输入q或Q并按Enter键,它将立即无限循环。谢谢!

2 个答案:

答案 0 :(得分:2)

您的while循环条件使用逻辑或。

假设您尝试退出循环并输入输入“ Q”。条件的第一部分将为FALSE,但条件的第二部分将为TRUE。由于它是逻辑OR,因此整个条件将为TRUE,并且将执行循环。如果输入“ q”,反之亦然。

因此,无论您输入什么内容,循环都会运行。

答案 1 :(得分:2)

程序中存在两个主要问题。

首先,条件addition != 'Q' || addition != 'q'始终为true,因为对于addition的任何值,addition != 'Q'addition != 'q'均为true(即addition永远不能同时是Qq。您可能是说addition != 'Q' && addition != 'q'

第二,当您对类型为cin >> addition的变量进行double时,您将收到一个有效的数字,或者-如果有人输入-'Q',例如“ nothing”和一个错误标志已设置。 “无”表示addition的值保持不变。

要完成“数字或'Q'”操作,您需要读取字符串并将其与"Q"(或"q")进行比较,否则尝试将字符串转换为一双。

代码片段如下所示:

int main() {

    double sum = 0;
    double toAdd;
    std::string input;
    bool end = false;

    while (!end) {
        cout << "enter a value to add (type Q or q to quit)" << endl;
        cin >> input;
        if (input == "Q" || input == "q") {
            end = true;
        }
        else {
            try {
                toAdd = stod(input);
                sum += toAdd;
            } catch (out_of_range &e) {
                cout << "input " << input << " is out of range." << endl;
            } catch (invalid_argument &i) {
                cout << "input " << input << " is not a valid number." << endl;
            }
        }
    }
    cout << "sum: " << sum << endl;

}