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

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

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

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

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

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

2: #include

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

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 воспринимает символ разрыва строк как разделитель и оставляет его в буфере ввода.

В строке 14 пользователю вновь предлагается ввести строку, которая теперь уже считывается оператором ввода. В нашем примере вводится строка four five six, после чего первое слово four присваивается переменной stringTwo. После отображения предложения Enter string three: снова вызывается функция getline. Так как часть строки five six все еще находится в буфере ввода, она сразу считывается до символа новой строки. Функция getline завершает свою работу, и строкой 20 выводится значение переменной stringThree.

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

Перейти на страницу:

Похожие книги

Сущность технологии СОМ. Библиотека программиста
Сущность технологии СОМ. Библиотека программиста

В этой книге СОМ исследуется с точки зрения разработчика C++. Написанная ведущим специалистом по модели компонентных объектов СОМ, она раскрывает сущность СОМ, помогая разработчикам правильно понять не только методы модели программирования СОМ, но и ее основу. Понимание мотивов создания СОМ и ее аспектов, касающихся распределенных систем, чрезвычайно важно для тех разработчиков, которые желают пойти дальше простейших приложений СОМ и стать по-настоящему эффективными СОМ-программистами. Показывая, почему СОМ для распределенных систем (Distributed СОМ) работает именно так, а не иначе, Дон Бокс дает вам возможность применять эту модель творчески и эффективно для ежедневных задач программирования.

Дональд Бокс

Программирование, программы, базы данных / Программирование / Книги по IT