C как очистить cin
Всего лишь сбрасывает все флаги для потока, а мне нужно буфер потока очистить. В си была функция flushall(), только она не работает для потоков =(((
Re[4]: как очистить cin?
| От: | Аноним |
| Дата: | 09.03.04 22:02 |
| Оценка: |
Здравствуйте, _chill, Вы писали:
_>Всего лишь сбрасывает все флаги для потока, а мне нужно буфер потока очистить. В си была функция flushall(), только она не работает для потоков =(((
basic_ostream::flush See Also basic_ostream Class | basic_ostream Members Flushes the buffer. basic_ostream& flush( ); Return Value A reference to the basic_ostream object. Remarks If rdbuf is not a null pointer, the function calls rdbuf->pubsync. If that returns -1, the function calls setstate(badbit). It returns *this. Example // basic_ostream_flush.cpp // compile with: /EHsc #include void main( ) < using namespace std; cout "test"; cout.flush(); >
Re[5]: как очистить cin?
| От: | Аноним |
| Дата: | 09.03.04 22:11 |
| Оценка: |
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, _chill, Вы писали:
_>>Всего лишь сбрасывает все флаги для потока, а мне нужно буфер потока очистить. В си была функция flushall(), только она не работает для потоков =(((
А>basic_ostream::flush See Also basic_ostream Class | basic_ostream Members А>Flushes the buffer. А>basic_ostream& flush( ); А>Return Value А>A reference to the basic_ostream object. А>Remarks А>If rdbuf is not a null pointer, the function calls rdbuf->pubsync. If that returns -1, the function calls setstate(badbit). It returns *this. А>Example А>// basic_ostream_flush.cpp А>// compile with: /EHsc А>#include А>void main( ) А> < А>using namespace std; А> cout "test"; А> cout.flush(); А>> А>
сорри не глянул что там istream
Re: как очистить cin?
| От: | Шахтер |
| Дата: | 10.03.04 02:03 |
| Оценка: |
Здравствуйте, _chill, Вы писали:
_>Подскажите, пожалуйста, как очистить буфер потока стандартного ввода — cin?
/* main.cpp */ #include using namespace std; /* main() */ int main() < int c=0; cout "c c o m"> В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Очистка буфера ввода cin
Я только учу С++ и хочу сделать обработку неправильного введения пола друга. К примеру, пользователь вводит что-то кроме W и M и запрос на введение повторяется в цикле, что видно из кода. Также будет происходить, если пользователь введет много символов вместо одного. Но тут есть один момент. Дело в том, что так как тип переменной friend_sex char, то из потока ввода последовательность символов считывается посимвольно. Я написал abcd , допустим, но считалось сначала a , потом (если это в цикле, берется второй символ и происходит проверка, и так до конца). По сути, если написать abcMf , то на проверке четвертого символа цикл завершится, ибо проверка будет пройдена. Вопрос: Я хочу, чтобы при введение последовательности символов, считывался первый, а буфер ввода очищался от оставшихся. Посоветуйте, пожалуйста, функцию очистки буфера (cin.clear() не работает).
Пропускается cin.getline() при заполнении строки.

Здравствуйте. Может кто-нибудь знает, почему если я в первую строку введу больше символов чем положено, вторая cin.getline пропускается?
И может кто-нибудь подскажет, как лучше сделать, чтобы если пользователь вводит большее число символов чем положено, то программа снова попросит его ввести?
Я хотел сделать так.
doif (strlen(a)>10)a=10;>>while(a==10);
Но если я введу к примеру в строку большее количество символов чем положено, он запомнит что в strlen = 9 и все равно выполнит функцию.
Лучший ответ
cin.getline забирает с потока сколько может, остальное остается в буфере и забирается вторым getlain-ом.
1- очищать буфер ввода перед использованием - cin.ignore(1000,'/n');
2- использовать функцию которая сохраняет символ ввода в строку
(например fgets(a,11,stdin);). И если последний символ в строке не является '\n' - выдать сообщение о повторном вводе и очистить буфер.
dillonx 713Ученик (83) 8 месяцев назад
Спасибо за помощь. Только после добавления ignore между "введите текст второй строки" и cin.getline у меня в консоли ничего не происходит в момент ввода. Просто новая строка отступается и все.
И насчет второго пункта не очень понял.
Сергей Гений (53482) dillonx 713,
#include bool check(char* str) < while (*str) < if (*str == '\n') < *str = 0; return true; >str++; > std::cin.ignore(1000, '\n'); std::cout int main() < setlocale(0, ""); char a[11], b[11]; std::cout while (!check(a)); std::cout while (!check(b)); //далье ваши манипуляции std::cout
Остальные ответы
#include
#include
#include
#include
#include
#include
using namespace std;
struct Employee <
string name;
string phone;
private:
friend ostream& operator <<(ostream& out, const Employee& emp) <
return out >
friend bool operator <(const Employee& a, const Employee& b) <
if (a.name < b.name) return true;
if (a.name == b.name) return a.phone < b.phone;
return false;
>
>;
int main() <
system("chcp 1251 > nul");
vector phonebook <
< "Субботин", "36-94-73" >,
< "Алексеев", "55-17-89" >,
< "Иванов", "63-70-02" >,
< "Петров", "55-12-83" >,
< "Скворцов", "42-75-30" >,
< "Гудованцев", "42-75-30" >,
< "Сидоров", "10-08-44" >,
< "Субботин", "25-83-69" >,
< "Матвеев", "53-20-20" >
>;
sort(phonebook.begin(), phonebook.end());
for (const auto& record : phonebook) cout system("pause > nul");
>
Похожие вопросы
Урок №72. Обработка некорректного пользовательского ввода
Большинство программ, имеющих хоть какой-либо пользовательский интерфейс, сталкиваются с обработкой пользовательского ввода. В программах, которые мы писали раньше, используется std::cin для получения пользовательского ввода. А так как ввод данных имеет свободную форму (пользователь может ввести всё, что пожелает), то пользователю очень легко ввести данные, которые от него никак не ожидаются.
При написании программ, вы всегда должны учитывать, как пользователи (преднамеренно или непреднамеренно) могут использовать ваши программы. Хорошо написанная программа предвидит, как ею могут злоупотребить, и либо будет обрабатывать такие случаи, либо предотвращать их (если это возможно). Программа, которая имеет обработку некорректного ввода, называется надежной.
На этом уроке мы рассмотрим, как пользователи могут вводить некорректные данные через std::cin, а также как с этим бороться.
Оглавление:
- std::cin, буфер данных и извлечение
- Проверка пользовательского ввода
- Основные типы некорректного пользовательского ввода
- Ошибка №1
- Ошибка №2
- Ошибка №3
- Ошибка №4
- Объединяем всё вместе
- Заключение
std::cin, буфер данных и извлечение
Прежде чем разбираться с обработкой некорректного ввода через std::cin и оператор >> , давайте сначала рассмотрим их принцип работы.
Процесс, когда мы используем оператор >> для получения данных от пользователя и размещение этих данных в определенной переменной, называется извлечением. Соответственно, оператор >> называется оператором извлечения.
Когда пользователь вводит данные в ответ на операцию извлечения, то эти данные помещаются в буфер std::cin. Буфер данных — это просто часть памяти, зарезервированная для временного хранения данных, когда они перемещаются из одного места в другое. В этом случае буфер используется для хранения пользовательского ввода, пока он находится в режиме ожидания выделения для него переменных.
При использовании оператора извлечения, выполняется следующая процедура:
Если во входном буфере есть данные, то эти данные используются для извлечения.
Если во входном буфере нет данных, то пользователю предлагается ввести данные (обычно именно это и происходит в большинстве случаев). Когда пользователь нажимает Enter, символ новой строки \n помещается во входной буфер.
Оператор >> извлекает столько данных из входного буфера в переменную, сколько позволяет размер самой переменной (игнорируя любые пробелы, табы или \n ).
Любые данные, которые не были извлечены, остаются во входном буфере для последующего извлечения.
Извлечение данных считается успешным, если по крайней мере один символ был извлечен из входного буфера. Оставшиеся данные во входном буфере используются для последующих извлечений. Например:
std :: cin >> a ;
Если пользователь введет 7d , то 7 будет извлечено, преобразовано в целое число и присвоено переменной a . А d\n останется во входном буфере дожидаться следующего извлечения.
Извлечение не выполняется, если данные ввода не соответствуют типу переменной, выделенной для них. Например:
std :: cin >> a ;
Если бы пользователь ввел z , то извлечение не выполнилось бы, так как z не может быть извлечено в целочисленную переменную.
Проверка пользовательского ввода
Существует три основных способа проверки пользовательского ввода:
Предотвращение некорректного пользовательского ввода.
Пользователь может вводить всё, что хочет, но осуществляется последующая проверка данных. Если проверка прошла успешно, то выполняется перемещение данных в переменную.
Пользователь может вводить всё, что хочет, но при операции извлечения данных оператором >> параллельно решаются возможные ошибки.
Некоторые графические пользовательские интерфейсы или расширенные текстовые интерфейсы позволяют проверять ввод пользователя сразу (символ за символом). Программист создает функцию проверки данных, которая принимает и проверяет пользовательский ввод, и, если данные ввода корректны, то возвращается true, если нет — false. Эта функция вызывается каждый раз, когда пользователь нажимает на клавишу. Если функция проверки возвращает true, то символ, который пользователь ввел — принимается. Если функция возвращает false, то символ, который только что ввел пользователь — отбрасывается (и не отображается на экране). Используя этот метод, мы можем гарантировать, что любой пользовательский ввод будет корректным, так как любые неверные нажатия клавиш будут обнаружены и немедленно удалены. К сожалению, std::cin не поддерживает этот тип проверки.
Поскольку строки не имеют никаких ограничений на то, какие символы вводятся, то извлечение гарантированно будет успешным (хотя помним, что std::cin останавливает процесс извлечения при первом обнаружении символа пробела). После ввода строки программа сразу может её проанализировать. Однако этот анализ и последующая конвертация данных в другие типы данных (например, числа) может быть сложной, поэтому это делается только в редких случаях.
Чаще всего мы позволяем std::cin и оператору извлечения выполнять тяжелую работу. В соответствии с этим методом пользователь может вводить всё, что хочет, а далее std::cin и оператор >> пытаются извлечь данные и, если что-то пойдет не так, выполняется обработка возможных ошибок. Это самый простой способ, и его мы и будем рассматривать.
Рассмотрим следующую программу «Калькулятор», которая не имеет обработки ошибок: