Чтение онлайн

на главную

Жанры

Освой самостоятельно С++ за 21 день.

Либерти Джесс

Шрифт:

Листинг 16.5. Использование функции get с параметрами

1: // Листинг 16.5. Использование get с параметрами

2: #include <iostream.h>

3:

4: int main

5: {

6: char а, b, с;

7:

8: cout << "Enter three letters: ";

9:

10: cin.get(a).get(b).get(c);

11:

12: cout << "а: " << а << "\nb: " << b << "\nc: " << с << endl;

13: return 0;

14: }

Результат:

Enter three letters: one

а:

о

b: n

с: e

Анализ: В строке 6 объявляются символьные переменные а, b и с. В строке 10 трижды последовательно вызывается функция cin.get. Сначала вызывается cin.get(a), в результате первый символ буфера ввода заносится в а и возвращается объект cin, после чего происходит вызов cin.get(b), присваивающий очередной символ буфера переменной b. Аналогичным образом вызывается функция cin.get(c), присваивающая следующий символ переменной с.

Поскольку cin.get возвращает cin, можно было записать это следующим образом:

cin.get(a) >> b;

В этом случае cin.get(a) возвратит cin, поэтому следующее выражение будет иметь вид: cin >> b;.

Рекомендуется:Используйте оператор ввода >>, когда необходимо вводить значения, разделенные пробелами в строке. Используйте функцию get с символьным параметром, если нужно последовательно вводить все символы строки, включая пробелы.

Ввод строк со стандартного устройства ввода

Для заполнения массива символов можно использовать как оператор ввода (>>), так и методы get и getline.

Еще один вариант перегруженной функции get принимает три параметра. Первый параметр — это указатель на массив символов, второй указывает максимальное число символов в строке с учетом концевого нулевого символа, добавляемого автоматически, и третий задает разделитель строк.

Если для второго параметра установлено значение 20, функция get введет 19 символов и оборвет ввод строки, на которую указывал первый параметр, после чего добавит концевой нулевой символ. Третий параметр по умолчанию устанавливается как символ разрыва строки ( \n ). Если этот символ повстречается раньше, чем будет введен последний допустимый символ строки, функция вставит в этом месте концевой нулевой символ, но символ разрыва строки при этом останется в буфере и будет считан очередной функцией ввода.

Реализация этого метода ввода показана в листинге 16.6.

Листинг 16.6. Использование функции get для заполнения массива символов

1: // Листинг 16.6. Использование getc массивом символов

2: #include <iostream.h>

3:

4: int main

5: {

6: char stringOne[256];

7: char stringTwo[256];

8:

9: cout << "Enter string one: ";

10: cin.get(stringOne,256);

11: cout << "stringOne: " << stringOne << endl;

12:

13: cout << "Enter string two: ";

14: cin >> stringTwo;

15: cout << "StringTwo: " << stringTwo << endl;

16: return 0;

17: }

Результат:

Enter string one: Now is the time

stringOne: Now is the time

Enter string two: For all good

StringTwo: For

Анализ:

В строках 6 и 7 создаются два массива символов. Строка 9 предлагает пользователю ввести строку, после чего в строке 10 вызывается функция

cin.get с тремя параметрами. Первый параметр ссылается на заполняемый массив символов, второй задает максимально возможное количество символов в строке с учетом нулевого концевого символа ('\0'). Третий параметр не установлен, и используется заданный по умолчанию символ разрыва строки.

Пользователь вводит строку Now is the time. Вся строка вместе с концевым нулевым символом помещается в массив stringOne.

Вторую строку пользователю предлагается ввести в строке 13, однако в этом случае уже используется оператор ввода. Поскольку он считывает строку до первого пробела, во втором случае в буфер заносится строка Все, что, конечно же, неправильно.

Один из способов решения этой проблемы заключается в использовании функции getline, как показано в листинге 16.7.

Листинг 1B.7. Использование функции getline

1: // Листинг 16.7. Использование getline

2: #include <iostream.h>

3:

4: int main

5: {

6: char stringOne[256];

7: char stringTwo[256];

8: char stringThree[256];

9:

10: cout << "Enter string one: ";

11: cin.getline(stringOne,256);

12: cout << "stringOne: " << stringOne << endl;

13:

14: cout << "Enter string two: ";

15: cin >> stringTwo;

16: cout << "stringTwo: " << stringTwo << endl;

17:

18: cout << "Enter string three: ";

19: cin.getline(stringThree,256);

20: cout << "stringThree: " << stringThree << endl;

21: return 0;

22: }

Результат:

Enter string one: one two three

stringOne: one two three

Enter string two: four five six

stringTwo: four

Enter string three: stringThree: five six

Анализ: Этот пример требует детального исследования, поскольку возможны некоторые сюрпризы.

В строках 6—8 объявляются массивы символов. В строке 10 пользователю предлагается ввести строку текста, которая считывается функцией getline. Аналогично функции get, параметры getline устанавливают буфер ввода и максимальное число символов. Однако, в отличие от get, функция getline считывает и удаляет из буфера символ разрыва строки. Как вы помните, функция get воспринимает символ разрыва строк как разделитель и оставляет его в буфере ввода.

Поделиться:
Популярные книги

Черный Маг Императора 13

Герда Александр
13. Черный маг императора
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 13

Последняя Арена 4

Греков Сергей
4. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Последняя Арена 4

Маяк надежды

Кас Маркус
5. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Маяк надежды

Великий перелом

Ланцов Михаил Алексеевич
2. Фрунзе
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Великий перелом

Сопротивляйся мне

Вечная Ольга
3. Порочная власть
Любовные романы:
современные любовные романы
эро литература
6.00
рейтинг книги
Сопротивляйся мне

Инквизитор Тьмы 2

Шмаков Алексей Семенович
2. Инквизитор Тьмы
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Инквизитор Тьмы 2

Мастер Разума V

Кронос Александр
5. Мастер Разума
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Мастер Разума V

Бандит 2

Щепетнов Евгений Владимирович
2. Петр Синельников
Фантастика:
боевая фантастика
5.73
рейтинг книги
Бандит 2

Истребители. Трилогия

Поселягин Владимир Геннадьевич
Фантастика:
альтернативная история
7.30
рейтинг книги
Истребители. Трилогия

Гардемарин Ее Величества. Инкарнация

Уленгов Юрий
1. Гардемарин ее величества
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Гардемарин Ее Величества. Инкарнация

Падение Твердыни

Распопов Дмитрий Викторович
6. Венецианский купец
Фантастика:
попаданцы
альтернативная история
5.33
рейтинг книги
Падение Твердыни

"Дальние горизонты. Дух". Компиляция. Книги 1-25

Усманов Хайдарали
Собрание сочинений
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Дальние горизонты. Дух. Компиляция. Книги 1-25

Ох уж этот Мин Джин Хо 2

Кронос Александр
2. Мин Джин Хо
Фантастика:
попаданцы
5.00
рейтинг книги
Ох уж этот Мин Джин Хо 2

Энфис 6

Кронос Александр
6. Эрра
Фантастика:
героическая фантастика
рпг
аниме
5.00
рейтинг книги
Энфис 6