循环时的输入验证是无限的

input validation while loop is infinite

本文关键字:无限 验证 输入 循环      更新时间:2023-10-16
#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 Additionn"
        << "'S' For subtractionn" << "'D' For divisionn"
        << "'M' For multiplicationn";
    cin >> variable;
    switch (variable)
    {
    case 'A':
    {
        cout << "Enter 0 for inputn";
        cin >> addition;
        while(addition != 'Q' || addition != 'q')
        {
            cout << "Enter numbers for addingnThen type in"
                << "Q or q to quitn";
            cin >> addition;
            total += addition;
        }
        cout << "Your total is " << total << endl;
    }

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

while 循环的条件使用逻辑 OR。

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

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

您的程序中有两个主要问题。

首先,条件addition != 'Q' || addition != 'q'总是true,因为对于任何addition值,addition != 'Q'addition != 'q'都是true(即 addition永远不可能同时Qq)。你可能的意思是addition != 'Q' && addition != 'q'

其次,当您使用类型为 double 的变量进行cin >> addition时,您将收到一个有效数字,或者 - 如果有人输入 - "Q",例如"无"并设置错误标志。"无"意味着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;
}