cin clear cin ignore

Каково значение cin.clear() и cin.ignore() ? Почему нужны параметры 10000 и
?

cin.clear() очищает флаг ошибки cin (так что будущие операции ввода-вывода будут работать правильно), а затем cin.ignore(10000, ‘
‘) переходит к следующей новой строке (чтобы игнорировать что-либо еще в той же строке, -number, чтобы он не вызывал другого сбоя анализа). Он будет пропускать только до 10000 символов, поэтому код предполагает, что пользователь не будет вводить очень длинную недопустимую строку.

если возникает ошибка при вводе данных из cin. Если возникает ошибка, устанавливается флаг ошибки, и будущие попытки получить ввод не удастся. Вот почему вам нужно

чтобы избавиться от флага ошибки. Кроме того, вход, который вышел из строя, будет сидеть в том, что я предполагаю, является своего рода буфером. Когда вы попытаетесь получить ввод снова, он будет считывать один и тот же вход в буфере, и он снова сработает. Вот почему вам нужно

Он вынимает 10000 символов из буфера, но останавливается, если встречает новую строку (
). 10000 — это просто общая ценность.

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

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

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

Решение

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

Проблема в линии

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

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

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

Другие решения

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

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

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

cin.clear (1000, ‘ n’);

1000 — это количество символов, которое нужно игнорировать, измените его на то, что вы хотите

В некоторых случаях возникает необходимость пропустить часть символов строки от начала до достижения конца строки (EOL) или конца файла (EOF). Именно этому и отвечает функция ignore(). Она принимает два параметра: число пропускаемых символов и символ разделения. Например, вызов функции ignore(80, ‘
‘) приведет к пропуску 80 символов, если ранее не будет найден символ начала новой строки. Последний затем будет удален из буфера, после чего функция ignore() завершит свою работу. Использование функции ignore() показано в листинге 16.8.

Листинг 16.8. Использование функции ignore()

1: // Листинг 16.8. Использование ignore()

6: char string0ne[255];

7: char stringTwo[255];

9: cout . В строке 10 для считывания этой строки используется функция get(), которая присваивает эту строку переменной stringOne и останавливается на символе начала новой строки, оставляя его в буфере ввода.

В строке 13 пользователю еще раз предлагается ввести вторую строку, однако в этот раз функция getline() в строке 14 считывает символ разрыва строки, оставшийся в буфере, и сразу же завершает свою работу.

В строке 19 пользователю предлагается ввести первую строку. Однако в этом случае для пропуска символа разрыва строки используется функция ignore() (см. в листинге 16.8 строку 23). Таким образом, при вызове getline() строкой 26 буфер ввода пуст, и пользователь получает возможность ввести следующую строку.

Функции-члены peek() и putback()

Объект cin обладает двумя дополнительными методами, которые могут оказаться весьма полезными. Метод peek()просматривает, но не считывает очередной символ. Метод putback() вставляет символ в поток ввода. Использование этих методов показано в листинге 16.9.

Листинг 16.9. Использование функций peek() В putback()

1: // Листинг 16.9. Использование peek() и putback()

7: cout в Windows или и в MS DOS и UNIX соответственно). (Не забывайте, что функция cin.get() возвращает 0 в конце файла.) Если текущий символ оказывается восклицательным знаком, он отбрасывается, а в поток ввода функцией putback() возвращается символ $. Если же текущий символ не является восклицательным знаком, он выводится на экран. Если текущий символ оказывается #, то он пропускается функцией ignore().

Указанный подход далеко не самый эффективный способ решения подобных задач (более того, если символ # будет расположен в начале строки, то программа его пропустит). Но наша основная цель состояла в том, чтобы продемонстрировать работу функций putback() и ignore(). Впрочем, их использование достаточно просто и понятно.

Примечание: Методы peek() и putback() обычно используются для синтаксического анализа строк. Необходимость в нем возникает, например, при создании компилятора.

Ввод данных с помощью cout

Ранее вы уже использовали объект cout вместе с перегруженным оператором вывода (

Очистка буфера вывода

Вы, вероятно, уже заметили, что использование endl приводит к очистке буфера вывода. Этот оператор вызывает функцию-член flush() объекта cout, которая и осуществляет очистку буфера. Вы можете напрямую вызывать метод flush(), либо вызвав функцию-член flush(), либо написав следующее выражение:

Результат:

Примечание: При запуске этой программы некоторые компиляторы не выведут заданное слово Hello. Если эта проблема коснется и вас, просто пропустите этот листинг и идите дальше.

Анализ: Строку 6 можно представить следующим образом: функция cout.put(‘H’) выводит букву H на экран и возвращает объект cout. Оставшуюся часть выражения можно представить следующим образом:

Выводится буква e, после чего остается cout.put(‘l’). Таким образом, повторяется цикл, на каждом этапе которого выводится следующая бука и возвращается объект cout. После вывода последнего символа (‘
‘) выполнение функции завершается.

Функция write() работает так же, как и оператор ввода (

7: char One[] = «One if by land»;

11: int fullLength = strlen(One)

12: int tooShort = fullLength -4;

13: int tooLong = fullLength +6;

Последнее изменение этой страницы: 2016-12-10; Нарушение авторского права страницы

Источник: computermaker.info

Понравилась статья? Поделиться с друзьями:
Ок! Компьютер
Добавить комментарий