Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Ввод текстовых строк с клавиатуры






Вывод текстовых строк на экран сложностей не вызывает:

 

char Str[21] = “Это пример текста”;

cout < < setw(40) < < right < < Str < < endl;

cout < < “Это текстовый литерал.” < < endl;

 

При выводе строк можно использовать форматирование (манипуляторы или функции потока вывода).

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

 

Непосредственное чтение текстовых строк из потока вывода:

 

char Str[21];

cin > > Str; // Пусть введена строка “Это пример текста”

cout < < Str < < endl; // На экран будет выведено толькослово “Это”

 

Как видно, всю введенную строку текста прочитать не удалось. Такой способ чтения (с помощью оператора > >) обеспечивает ввод символов до первого пробельного символа (по словам), а не до конца строки. Остальные символы введенного с клавиатуры предложения остаются в потоке ввода и могут быть прочитаны из него следующими операторами > >.

Для того чтобы прочесть всю строку полностью, можно воспользоваться одной из функций gets или gets_s (для этого в программу должен быть включен заголовочный файл < stdio.h>):

 

const int N = 21;

char Str [N];

gets (Str); // Пусть введена строка “Это пример текста”

// gets_s (Str, N); Альтернативный вариант

cout < < Str < < endl; // На экран будет выведено “ Это пример текста”

 

Функция gets имеет один параметр, соответствующий массиву символов, в который осуществляется чтение. Вторая функция (gets_s) имеет второй параметр, задающий максимальную длину массива символов Str.

Не смотря на то, что функция gets_s (в отличие от gets) позиционируется как безопасная, и та и другая при вводе текста, длина которого (вместе с нулевым символом) превышает значение второго параметра (то есть длины символьного массива Str), приводит к возникновению ошибки при выполнении программы

Более предпочтительным, по-видимому, является использование функции потока ввода cin.getline:

 

const int N = 21;

char Str [N];

cin.getline (Str, N); // Пусть введена строка “Это пример текста”

cout < < Str < < endl; // На экран будет выведено “ Это пример текста”

 

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

Если длина введенного с клавиатуры текста превышает максимальную длину массива Str, в него будет записано (в нашем примере) 20 символов вводимого текста и нулевой символ. Остальные символы введенного текста остаются во входном потоке и могут быть взяты из него следующими инструкциями ввода.

Рассмотри следующий пример:

 

const int N = 11;

char Str [N];

cin.getline (Str, N); // Пусть введена строка “Это пример текста”

cout < < Str < < endl; // На экран будет выведено “Это пример” – 10 символов

cin.getline (Str, N); // Ожидается чтение остальных символов: “ текста”

cout < < Str < < endl; // Однако на экран будет выведена пустая строка

 

Все последующие попытки чтения из потока будут игнорироваться. Причина этого кроится в том, что попытка чтения введенного слишком длинного текста, переводит входной поток в состояние ошибки, при котором дальнейшее чтение из потока невозможно. Для того чтобы продолжить чтение из потока, необходимо восстановить его нормальное состояние. Этого можно достигнуть с помощью функции потока cin.clear(), которая сбрасывает состояние потока в нормальное:

 

const int N = 11;

char Str [N];

cin.getline (Str, N); // Пусть введена строка “Это пример текста”

cout < < Str < < endl; // На экран будет выведено “Это пример” – 10 символов

cin.clear(); // Сбрасываем состояние потока в норму

cin.getline (Str, N); // Не останавливаясь дочитываем оставшиеся в потоке символы

cout < < Str < < endl; // На экран выведено: “ текста”

 

Если забирать остатки данных из потока ввода не надо, то следует очистить его с помощью функции cin.sync():

 

const int N = 11;

char Str [N];

cin.getline (Str, N); // Пусть введена строка “Это пример текста”

cout < < Str < < endl; // На экран будет выведено “Это пример” – 10 символов

cin.clear(); // Сбрасываем состояние потока в норму

cin.sync(); // Очищаем поток от оставшихся символов

cin.getline (Str, N); // Ждем очередного ввода данных. Введено: “Слово”

cout < < Str < < endl; // На экран выведено: “Слово”

 

Правильное использование функций cin.clear() и cin.sync() является очень существенным фактором при организации консольного ввода данных.

Функция cin.getline может иметь третий параметр, задающий символ, при встрече которого чтение строки из потока прекращается. Например:

cin.getline (Str, N, ‘, ’);

При таком использовании этой функции чтение из потока будет прекращено, если из него прочитано N – 1 символов, или встретился символ конца строки ввода, или встретился символ ‘, ’.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.