Как правильно использовать cin.clear и cin.ignore - PullRequest
0 голосов
/ 13 сентября 2018
    int main()
{
    int oddeven = 1;
    int modulotwo;
    // Simple loop since no reason to check 0
    while(oddeven != 0){
        //user input
        cout << "\n\nIn while loop\n";
        cout << "Input number to determine if it is odd or even.\n";
        cin >> oddeven;
        //check to see if input succesful
        if(!(cin.fail())) {
            cout << "In if loop\n";
            cout << "Divide by two and put in modulotwo.\n";
            //check to see if odd or even by dividing by 2
            modulotwo = oddeven % 2;
            cout << "Output modulotwo: ";
            //visual confirmation of remainder
            cout << modulotwo << "\n";
            if (modulotwo == 0) {
                cout << "Check modulotwo against 0\n";
                cout << "The number " << oddeven << " is even.\n";

            }
            else {
                cout << "The number " << oddeven << " is odd.\n";

            }
        }
        //If input not succesful
        else {
            cout << "In else statement. Set oddeven to 1\n";
            //set oddeven to 1 to stop exit
            oddeven = 1;
            cout << "Not a usable number, please input integer number." << endl;
            cout << "Run cin.clear\n";
            cin.clear();
            cout << "Run cin.ignore\n";
            cin.ignore(std::numeric_limits<std::streamsize>::max());

        }
    }

}

У меня есть выше, "простой" код, чтобы проверить, было ли число нечетным или четным. Я пытаюсь добавить исправление ошибок, чтобы убедиться, что ввод правильного типа. Мне указали на cin.clear и cin.ignore. Моя проблема в том, что если я вызываю ошибку, она корректно переходит в оператор else, но это так. Это больше не будет управлять остальными. Я предполагаю это от cin.ignore. Как мне заставить его правильно очистить ошибку и вернуться к входному циклу? Если я удаляю cin.ignore, я получаю непрерывный цикл, сообщающий мне, что 1 нечетно, не ожидая ввода.

Дополнительный выходной текст был моим способом попытаться отследить, где был код и что он делал.

Редактировать. Я действительно прокомментировал cin.ignore перед публикацией здесь. Я пытался исследовать проблему сам и натолкнулся на комментарий об этом в поисках символа новой строки, но, как вы все также узнали, это не работает. Проблема проявляется при вводе буквы, а не любого числа, слишком большого или иного.

Ответы [ 3 ]

0 голосов
/ 13 сентября 2018

Я сам попробовал ваш код, и мой компилятор сразу же дал мне сообщение об ошибке, указывающее на эту строку:

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

Ваш второй аргумент в функции cin.ignore должен быть символом, а не строкой.Просто измените кавычки и отредактируйте строку, чтобы она показала

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

. После этого все должно работать так, как вы хотите :).Я хотел бы рассмотреть возможность обновления вашей IDE или компилятора, чтобы улучшить отображение сообщений об ошибках / стеков вызовов.

0 голосов
/ 13 сентября 2018

cin.clear (1000, '\ n');

1000 - количество игнорируемых символов, замените его на любое, которое вы хотите

0 голосов
/ 13 сентября 2018

Моя проблема в том, что если я вызываю ошибку, она корректно переходит в оператор else, но это так.Он больше не будет запускать остальные.

Проблема в строке

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

Второй аргумент должен быть символом, а не строкой.

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

Увеличьте уровень предупреждения вашего компилятора для обнаружения таких ошибок.

Используя g++ -std=c++11 -Wall, я получаю следующее предупреждение / сообщение об ошибке.

socc.cc: In function ‘int main()’:
socc.cc:43:70: error: invalid conversion from ‘const char*’ to ‘std::basic_istream<char>::int_type {aka int}’ [-fpermissive]
          cin.ignore(std::numeric_limits<std::streamsize>::max(), "\n");
                                                                      ^
In file included from /usr/include/c++/5/iostream:40:0,
                 from socc.cc:1:
/usr/include/c++/5/istream:657:5: note:   initializing argument 2 of ‘std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::ignore(std::streamsize, std::basic_istream<_CharT, _Traits>::int_type) [with _CharT = char; _Traits = std::char_traits<char>; std::streamsize = long int; std::basic_istream<_CharT, _Traits>::int_type = int]’
     basic_istream<char>::
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...