Почему цикл бесконечен? - PullRequest
0 голосов
/ 24 октября 2019

Я делаю домашнее задание и пытаюсь защитить его от ввода символов, но каким-то образом написание символа внутри все еще нарушает его, потому что это делает цикл бесконечным. Может кто-нибудь предложить способ исправить это? Вот код:

#include <iostream>
#include <cstdlib>
#include <ctime>
int main()
{
    srand( time( NULL ) );

    int given = 0;
    int imaginarynum = ( std::rand() % 99 ) + 1;
    int tries = 0;

    std::cout << "Hello! We'regoing to play an easy game! I'm goinng to think of a number between 1-100 and you'll have to guess it! " << std::endl;
    std::cout << given << " "<< imaginarynum;

    while(given < imaginarynum || given > imaginarynum)
    {
        std::cin >> given;
        bool error = std::cin.fail();
        std::cin.clear();
        std::cin.sync();

        while(error != false)
        {
            std::cout << "That's not a number!" << std::endl;
            std::cin >> given;
            bool error = std::cin.fail();
            std::cin.clear();
        }

        if (given < imaginarynum)
        {
            std::cout << "I thought of a bigger number! " << std::endl;
            std::cout << "Guess again!" << std::endl;
            tries = tries + 1;
        }else if (given > imaginarynum)
        {
            std::cout << "I thought of a smaller number! " << std::endl;
            std::cout << "Guess again!" << std::endl;
            tries = tries + 1;
        }
        else
        {`enter code here`
            tries = tries + 1;
            std::cout << "Good job! " << std::endl << "It took you: " << tries << " Tries!";
        }
    }

    return 0;
}

1 Ответ

5 голосов
/ 24 октября 2019

Проблема в том, что вы используете две переменные error

    while(error != false)
    {
        std::cout << "That's not a number!" << std::endl;
        std::cin >> given;
        bool error = std::cin.fail();
        std::cin.clear();
    }

В цикле вы объявили новую переменную. Замените объявление оператором присваивания

    while(error != false)
    {
        std::cout << "That's not a number!" << std::endl;
        std::cin >> given;
        error = std::cin.fail();
        std::cin.clear();
    }

И вторая проблема заключается в том, что вам необходимо очистить буфер. Например,

#include <limits>

//...

std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );

Цикл будет выглядеть следующим образом

    #include <limits>

    //...

    while(error != false)
    {
        std::cout << "That's not a number!" << std::endl;
        std::cin >> given;
        error = std::cin.fail();
        std::cin.clear();
        std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
    }
...