我的while语句是无限循环?

时间:2015-05-15 14:11:33

标签: c++ while-loop

#include "stdafx.h"
#include <iostream>
#include <string>

#include <stdio.h>
#include <stdlib.h>
#include <time.h>



using namespace std;

//this program will let the user input their assignment score and see their letter grade
int main() {

    int score;

    cout << "Input your score: ";

    //to make the while loop
    int x = 1;

    while (x == 1) {

        cin >> score;

        if (score >= 90){
            cout << "\nA";
            break;
        }

        else if (score >= 80) {
            cout << "\nB";
            break;
        }

        else if (score >= 70) {
            cout << "\nC";
            break;
        }

        else if (score >= 60) {
            cout << "\nD";
            break;
        }

        else if (score >= 0) {
            cout << "\nF";
            break;
        }

        else
            cout << "\nInvalid input";
    }
}

我正在尝试编写一个程序,让用户输入他们的作业分数并显示他们的结果字母等级。如果用户输入不是有效分数,则会输出“无效输入”,并应再次询问用户输入。但是,当我实际运行程序并输入无效值时,它会进入打印“无效输入”的无限循环。为什么是这样?提前谢谢。

2 个答案:

答案 0 :(得分:7)

当用户输入无效输入时,cin >> score失败并在流上设置错误标记。

在您使用std::basic_ios::clear()清除该标记之前,后续的读取操作不会执行任何操作。

此外,由于读取失败,score有一些未指定的值(因为你没有初始化它),并且显然在你的测试运行中,未指定的值发生不匹配任何继续,所以你永远不会break

而不仅仅是:

std::cin >> score;

试试这个:

if (!(cin >> score)) {
   // If reading into an int failed, we come here
   cout << "Invalid value! Try again" << endl;

   // Clear error flag
   cin.clear();

   // Restart the loop
   continue;
}

您可能还需要让流在输入缓冲区中占用换行符。如果你得到“无效的价值!”消息两次,查看SO怎么做。

答案 1 :(得分:0)

你设置x = 1并检查x == 1。对于编译器来说,似乎它可能是一个无限循环,因为它不确定是否会发生中断,这就是为什么它只是一个警告而不是一个错误。对于那种行为,你甚至不需要扩大变量x,你也可以使用while(true)