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

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

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 символов, или встретился символ конца строки ввода, или встретился символ ‘,’.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: