Ввод текстовых строк с клавиатуры
Вывод текстовых строк на экран сложностей не вызывает:
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 символов, или встретился символ конца строки ввода, или встретился символ ‘,’.
Дата добавления: 2019-02-07; просмотров: 327;