Функция cin.get()
Объясните пожалуйста мне функцию cin.get() . Прочитал про него в Дейтел, но там как то не очень подробно и хорошо она описана. Может кто-то мне поподробнее рассказать, если не трудно?
Отслеживать
8,900 11 11 золотых знаков 31 31 серебряный знак 55 55 бронзовых знаков
задан 3 апр 2012 в 6:58
1,862 18 18 золотых знаков 75 75 серебряных знаков 131 131 бронзовый знак
А что, кроме Дейтолов других учебников и справочников не существует? И выход в интернет тоже перекрыли?
3 апр 2012 в 20:28
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
Когда метод get() вызывается с аргументом типа char или вообще аргументов, он извлекает следующий символ ввода, даже если это пробел, знак табуляции или символ новой строки. Версия get(char& ch) присваивает входящий символ своему аргументу, а версия get(void) просто использует входной символ, преобразует его в целочисленный тип (обычно — int) и возвращает это значение.
Плюс пару слов об еще парочке перегруженных разновидностях:
istream &get (char *buf, streamsize num); istream &get (char *buf, streamsize num, char delim);
Первая форма функции get() считывает символы в массив, на который ссылается указатель buf , пока не будет считан num — 1 символов, обнаружен символ перехода на следующую строку или достигнут конец файла. Эта функция записывает нулевой символ в конец массива, на который ссылается указатель buf . Символ перехода на новую строку не считывается (!). Он остается в потоке, пока не будет выполнена следующая операция ввода.
Вторая форма функции get () считывает символы в массив, на который ссылается указатель buf , пока не будет считан num — 1 символов, обнаружен символ delim или достигнут конец файла. Функция записывает нулевой символ в конец массива, на который ссылается указатель buf . Символ delim не считывается (!). Он остается в потоке, пока не будет выполнена следующая операция ввода.
cin.get() и его друзья
определенная в классе istream библиотеки по определению извлекает из входного потока один символ и возвращает его целочисленный код. Популярность ей принес тот факт, что ее удобно использовать в программах с консольным интерфейсом, которые запускаются не из консоли, например, из проводника или из графического интерфейса IDE. После завершения работы программы мы не сможем увидеть ее финальный вывод, поскольку выполнится инструкция return и программа завершится, закрывая «за собой» консольное окно.
Функция get() же стандартного потока ввода cin заставляет систему ожидать ввода пользователем любого символа, который она считывает, и программа завершается.
Проблема в том, что работает cin.get() далеко не всегда. Почему? Рассмотрим ситуацию издалека.
Начнем с того, что же такое поток (stream). Ненаучным языком говоря, поток — последовательность символов. Источником символов может служить в частности клавиатура. Символы идут один за другим:
К ним возможен только последовательный доступ, но не произвольный, иными словами, чтобы извлечь из потока символ d , надо предварительно извлечь из него a , b и c . Извлеченный (прочитанный) символ удаляется из потока.
Надо сказать, что если по каким-то причинам из потока прочитаны не все символы до конца строки (символа ‘\n’ ) включительно, то после операции чтения поток не будет пустым. Два самых распространенных способа дают нам два хороших примера.
Уже рассматривавшаяся выше функция get() читает из потока один символ, так что если мы ввели несколько символов, то она оставит за собой непустой поток. И следующий вызов cin.get() будет обречен на «фиаско»: программа вместо того, чтобы остановиться и ждать пользовательского ввода, прочитает из входного потока очередной символ, оставшийся от предыдущего ввода, и продолжит свое выполнение. Или завершится «без спроса». Напомню, что get() возвращает приведенный к типу int код введенного символа, поэтому мы может использовать его в вышеприведенной инструкции — код просто будет выведен на экран.
Собственно вывод: если в конце программы cin.get() не ждет пользовательского ввода, значит, вы оставили за собой непустой входной поток.
2)
int a;
cin>>a;
Перегруженный оператор сдвига, использующийся для ввода данных из потока, который в свою очередь перегружен для работы с целыми числами (так как вызван с параметром a типа int ), считывает символы, являющиеся десятичными цифрами, до тех пор, пока не встретит нецифровой символ. Это может быть пробел, буква, табуляция, конец строки, и так далее.
Все эти символы остались в потоке. Даже если вы просто ввели число и нажали Enter, символ ‘\n’ остался в потоке.
На него и «нарывается» впоследствии cin.get() .
Следующая шуточная программка позволяет воочию увидеть «обидчика». Скомпилируйте ее, запустите и введите, к примеру,
Она выведет символ, на котором «споткнулся» cin.get() .
using namespace std;
Теперь, когда проблема очевидна, рассмотрим ее возможные решения. В порядке увеличения их сложности.
1)
Функция
определенная в классе istream , извлекает из потока символы и отбрасывает их. Причем она так поступает либо с n символами, либо со всеми символами, пока в потоке не встретится символ, заданный параметром delim .
В нашем случае мы стремимся отбросить максимальное число символов, которое может содержать поток, до первого перевода строки включительно.
2)
streambuf* istream::rdbuf() const;
streamsize streambuf::in_avail();
У потока ввода есть буфер чтения, в котором он хранит символы. Мы обращаемся к нему, вызывая функцию rdbuf() . А любой уважающий себя буфер знает, сколько символов в нем содержится. Поскольку и мы хотим это узнать, мы вызываем функцию in_avail() этого буфера. Это количество символов нам и нужно проигнорировать, что достигается так:
cin.ignore(cin.rdbuf()->in_avail());
Второй параметр функции ignore() имеет значение по умолчанию, что делает его необязательным, и мы его просто опускаем при вызове.
3)
int istream::sync();
Использование функции sync() — путь наименьшего сопротивления. Она просто очищает поток от имеющихся в нем символов.
Почему этот способ самый сложный — поищите в Гугле (если есть желание). А я в это время порекомендую Вам выбрать более понравившийся из первых двух и пойду заниматься более полезными делами
Хотя нет, напоследок еще расскажу о функции
void ios::clear(iostate state = goodbit);
Эта функция восстанавливает поток, если он по какой-либо причине оказался в ошибочном состоянии. Например, из потока пытались прочитать число, а там в это время находились буквы. В этом случае, поток переводится в состояние отказа, и дальнейшие операции с ним неосуществимы. В том числе и cin.get() . Функция же clear() «очищает» состояние потока, делая его вновь веселым и работоспособным.
На закуску пример и ссылки.
Объект cin в C++
Объект cin в C++ – это объект класса istream. Он используется для приема ввода со стандартного устройства ввода, т.е. клавиатуры. Он связан со стандартным входным потоком C stdin.
Декларация cin в С++
extern istream cin;
Он определен в заголовочном файле .
Гарантируется, что объект cin будет инициализирован во время или перед первым построением объекта типа ios_base :: Init. После создания объекта cin cin.tie() возвращает cout, что означает, что любая операция форматированного ввода в cin принудительно вызывает cout.flush(), если какие-либо символы ожидают вывода.
«C» в cin означает «символ», а «in» означает «ввод», следовательно, cin означает «ввод символов».
Объект cin используется вместе с оператором извлечения (>>) для получения потока символов. Общий синтаксис:
cin >> varName;
Оператор извлечения может использоваться более одного раза, чтобы принимать несколько входных данных как:
cin >> var1 >> var2 >> … >> varN;
Объект cin также можно использовать с другими функциями-членами, такими как getline(), read() и т. Д. Некоторые из наиболее часто используемых функций-членов:
- cin.get (char ch): читает введенный символ и сохраняет его в ch.
- cin.getline (char * buffer, int length): считывает поток символов в строковый буфер, останавливается, когда
- он прочитал символы длиной 1 или
- когда он находит символ конца строки (‘\ n’) или конец файла.
- он прочитал символы длиной 1 или
- когда он находит символ конца строки (‘\ n’) или конец файла.
Вычисление степени числа с использованием рекурсии на C++
Пример 1: cin с оператором извлечения:
#include using namespace std; int main() < int x, y, z; /* For single input */ cout > x; /* For multiple inputs*/ cout > y >> z; cout Enter a number: 9 Enter 2 numbers: 1 5 Sum = 15
Пример 2: cin с функцией-членом:
#include using namespace std; int main() < char name[20], address[20]; cout Name: Sherlock Holmes Address: Baker Street, UK You entered Name = Sherlock Holmes Address = Baker Street, UK
- Преобразование восьмеричного числа в десятичное и наоборот в C++
- Преобразование двоичного числа в восьмеричное и наоборот в C++
- Как перевернуть строку в C++
Что значит cin.get()?
Здравствуйте, не могу уложить в своем черепке (cin--ввод и get--получить) во что-то понятное и запоминающиеся, при этом в итоге, после выполнения этой функции появится число. Мне бы ссылку, да такую. что бы даже я понял. Спасибо.
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:Нюансы синтаксиса: что значит std::cin в условии цикла while?
do < int v1, v2; cout << "Please enter two numbers of sum:"; if (cin >> v1, v2) cout.Как работает cin.peek, cin,get, cin.ignore, cin.clear?
Здравствуйте, товарищи и не товарищи!:) Я только начал изучать C++, а уже использую вещи, которые.Защита от дурака при вводе текста с помощью: cin.get cin.clear cin.sync
Доброго времени суток. На С++ учусь с недавних пор. Имеется стандартная "защита от дурака" на ввод.Объясните пожалуйста как работают cin.good(), cin.sync(), cin.clear()
Такая проблема: сдаю в вуза лабораторные по программированию, писал все сам, до этого c++ не.Регистрация: 08.11.2020
Сообщений: 11
с стак оверфлоу:cin.get() не выводит, а считывает очередной символ из потока ввода.
А cout его выводит, но выводит не как символ, а как целое число (потому что cin.get() возвращает int) - код считанного символа.
610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,746Это функция класса std::istream, которая извлекает из потока один или более символов.
Пример:1 2 3
char c1 = cin.get(); char str[5]; cin.get(str, 5);
PS: Погугли StackOverflow. Там есть подробное объяснение на русском по этой функции.
1346 / 847 / 363
Регистрация: 26.02.2015
Сообщений: 3,775
295 / 115 / 49
Регистрация: 13.05.2020
Сообщений: 2691 2 3 4 5 6 7 8 9 10 11
#include #include int main() { string str; cout "\nВведите слово: "; cin.get (str); cout str endl; return 0; }
get() - это функция потока извлечения: cin. В данном случае вместо строки (string), может быть любой другой тип данных.
cin.get(str) - примет с клавиатуры то что ты введешь и запишет это в переменную str. На деле это можно сравнить с cin >> str. Но функция get() будет по - масштабней, т.к. может принимать несколько аргументов. Наподобие: сколько символов записать в переменную str. Например, cin.get(str, 30). Первые 30 символов, которые буду введены с клавиатуры запишутся в str, а остальные нет.