Для чего лучше использовать getline, а для чего cin?
Основное отличие это, то что getline функция, а cin объект. Но как это влияет на использование?
- Вопрос задан более трёх лет назад
- 724 просмотра
Комментировать
Решения вопроса 0
Ответы на вопрос 2

getline для получения текста написанного до нажатия клавиши enter, cin для получения текста до первого пробела(то есть » » .
Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать
Cin getline c что это
#include
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream); Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)): getline(), getdelim(): Начиная с glibc 2.10: _POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700 До glibc 2.10: _GNU_SOURCE
ОПИСАНИЕ
Функция getline() считывает целую строку из stream, сохраняет адрес буфера с текстом в *lineptr. Буфер завершается null и включает символ новой строки, если был найден разделитель для новой строки. Если *lineptr равно NULL и *n равно 0 перед вызовом, то getline() выделит буфер для хранения строки. Этот буфер должен быть высвобожден программой пользователя, даже если getline() завершилась с ошибкой. Как альтернатива, перед вызовом getline(), *lineptr может содержать указатель на буфер, выделенный с помощью malloc(3) размером *n байтов. Если буфер недостаточно велик для размещения строки, то getline() изменяет размер буфера с помощью realloc(3), обновляя *lineptr и *n при необходимости. В любом случае при успешном выполнении вызова *lineptr и *n будут содержать правильный адрес буфера и его размер, соответственно. Функция getdelim() работает аналогично getline(), за исключением того, что в аргументе delimiter можно задать разделитель строки, отличный от символа новой строки. Как и с getline(), символ-разделитель не добавляется, если его было в входных данных до конца файла.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении getline() и getdelim() возвращают количество считанных символов, включая символ разделителя, но не включая завершающий байт null (‘\0’). Это значение может использоваться для обработки встроенных байтов null при чтении строки. Обе функции возвращают -1 при ошибках чтения строки (включая условие достижения конца файла). При возникновении ошибки в errno сохраняется её значение.
ОШИБКИ
EINVAL Некорректные параметры (n или lineptr равно NULL или неправильное значение stream).
АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).
| Интерфейс | Атрибут | Значение |
| getline(), getdelim() | безвредность в нитях | безвредно (MT-Safe) |
СООТВЕТСТВИЕ СТАНДАРТАМ
Изначально, функции getline() и getdelim() были расширениями GNU. Позднее они были стандартизированы в POSIX.1-2008.
ПРИМЕР
#define _GNU_SOURCE #include #include int main(void) < FILE *stream; char *line = NULL; size_t len = 0; ssize_t read; stream = fopen("/etc/motd", "r"); if (stream == NULL) exit(EXIT_FAILURE); while ((read = getline(&line, &len, stream)) != -1) < printf("Получена строка длиной %zu :\n", read); printf("%s", line); >free(line); fclose(stream); exit(EXIT_SUCCESS); >
getline
Функция getline предназначена для ввода данных из потока, например, для ввода данных из консольного окна. Если формально описывать ее функционал, то она извлекает данные из входного потока до строкового разделителя, который не записывается в получившийся массив данных.
В итоге, получается извлечение одной строки и записывание ее в переменную. Сама конструкция getline выглядит так:
cin . getline ( string , streamsize , separator ) ;
где string – переменная типа char*, в которую запишется строка, streamsize — максимально количество символов, которое может быть записано в строку, и separator – строковый разделитель, показывающий на конец строки. Последний параметр функции можно опустить, тогда будет задан сепаратор по умолчанию — ‘\n’. Приведем пример работы функции getline в программе:
using namespace std ;
char str [ 256 ] ;
cout << "Введите четыре предложения: " << endl ;
cin . getline ( str , 256 , ';' ) ;
cin . getline ( str , 256 , ';' ) ;
Для начала нужно подключить соответствующую библиотеку iostream для работы с потоками ввода/вывода. Программа записывает 2 предложения, предложение является законченным, только если в конце стоит ’;’ или такой символ не стоит, но длина предложения 256 символов. В функции в качестве потока поставлен вывод с экрана cin, запись идет в str и разделителем является ’;’. После записи предложения выводятся на экран.
Функция getline с типом string
У функции getline есть ещё один популярный вариант, использующий строковый тип неограниченной длины string
Как работает getline()?
Задача очень проста: на вход поступает количество принимаемых строк, и затем сами строки. На выход должно выйти (через пробел) количество гласных в этих строках.
// Подсчет гласных в строке #include #include #include #include using namespace std; class count_predicate < public: bool operator()(const char& expr) < if ( expr == 'a' || expr == 'o' || expr == 'i' || expr == 'u' || expr == 'y' || expr == 'e' ) return true; return false; >>; int main() < int N; // Нужное количество строк cin >> N; string strs[N]; for (int i = 0; i < N; i++) getline(cin, strs[i]); for (int i = 0; i < N; i++) < int n = count_if(strs[i].begin(), strs[i].end(), count_predicate()); cout return 0; >
Когда вместо getline() я использую обычный cin>> , то все работает, но строки попадаются с пробелами, поэтому гласные считаются некорректно. Здесь же почему-то getline() каким-то образом «перебивает» cin сверху, и считывает количество строк как еще одну строку, как я понял из теста программы (но это не точно). Собственно, почему так происходит? И еще, у меня такое ощущение, что я решаю задачу очень топорно, есть ли какое-то более элегантное решение?
Особенно меня смущает количество проверок в предикате. Если такое решение есть, можно и без STL, ей я пользуюсь исключительно в учебных целях, закрепляю, так сказать, пройденный материал.
Отслеживать
219k 15 15 золотых знаков 119 119 серебряных знаков 230 230 бронзовых знаков