ТОП 10:

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



 

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

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

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

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

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

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

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

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

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

Как вы помните, можно использовать несколько вариантов перегруженной функ- ции-члена get(). В первом варианте она не принимает никаких параметров и возвращает значение полученного символа. Во втором принимается ссылка на односимвольную переменную и возвращается объект istream. В третьей, последней версии в функцию get() устанавливаются массив символов, количество считываемых символов и символ разделения (которым по умолчанию является разрыв строки). Эта версия функции get () возвращает символы в массив либо до тех пор, пока не будет введено максимально возможное количество символов, либо до первого символа разрыва строки. Если функция get() встречает символ разрыва строки, ввод прерывается, а символ разрыва строки остается в буфере ввода.

Функция-член getline() также принимает три параметра: буфер ввода, число символов в строке с учетом концевого нулевого символа и символ разделения. Функция getline() действует аналогично описанной выше функции get(), но отличается от последней только тем, что не оставляет в буфере символ разрыва строки.







Последнее изменение этой страницы: 2016-12-10; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.232.51.69 (0.004 с.)