Еще один вариант перегруженной функции 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, так как оператор >> считывает строку только до первого пробела и вставляет найденное слово в массив символов.