11.4. Строки с как аргументы и параметры
Строковая переменная С — это массив, поэтому когда она используется как параметр функции, тип данного параметра является типом массива. Функция может изменять значение строковой переменной так же, как значение любого другого параметра типа массива, поэтому вместе с ней обычно передается дополнительный аргумент типа int, в котором задается объявленный размер этой строковой переменной.
Если же функция использует значение строкового аргумента С, не изменяя его, дополнительный аргумент (в котором задавался бы объявленный размер массива или количество его заполненных элементов) не нужен. Конец строкового значения, хранящегося в строковой переменной С, отмечает нуль-символ '\0'.
11.5. Ввод и вывод строк с
Строки С можно выводить с помощью оператора вывода <<. Фактически мы уже делали это для литеральных строк, заключенных в двойные кавычки. Точно так же можно использовать и строковые переменные. Например: cout << news << " Wow.\n";
Здесь news — строковая переменная С.
Строковые переменные С можно заполнять, используя оператор ввода >>, но нужно иметь в виду одно обстоятельство: как и для других типов данных, при вводе строк С пропускаются символы пробела, табуляции и перевода строки. Более того, на очередном из перечисленных символов процесс чтения входных данных останавливается. Рассмотрим следующий код:
char а[80], b[80];
cout « "Enter some input:\n";
cin » a » b;
cout « a « b « "END OF OUTPUT\n";
Если выполнить его в составе программы C++, получится примерно такой диалог:
Enter some input:
Do be do to you!
DobeEND OF OUTPUT
В строковые переменные а и b введенный текст добавляется по словам: в а помещается строка "Do", поскольку за ней следует пробел, а в b помещается строка "be", за которой тоже введен пробел.
Если вы хотите, чтобы программа прочитала всю строку с символами пробела и табуляции, то можно прочитать ее по частям с помощью оператора ввода >>, а потом собрать в единое целое. Но это, во-первых, утомительно, а во-вторых, вы не сможете различить символы пробела и табуляции и не будете знать их количества. Гораздо проще и надежнее воспользоваться стандартной функцией-членом getline, включенной в любой входной потоковый объект: и в cin, и во входной файловый поток. У функции getline есть два аргумента. Первым является строковая переменная, в которую вводятся данные, а вторым — целое число, обычно задающее объявленный размер строковой переменной. Функция интерпретирует второй аргумент как максимальное количество элементов, заданных в первом аргументе массива, которые можно заполнить символами. В качестве примера рассмотрим следующий код:
char a[80];
cout << "Enter some input:\n";
cin.getline(a, 80);
cout << a << "END OF OUTPUT\n";
При выполнении его в составе полной программы можно получить такой диалог:
Enter some input:
Do be do to you!
Do be do to you!END OF OUTPUT
Функция cin.getline считывает всю строку. Чтение закончится, когда будет достигнут конец строки, даже если она короче принимающей переменной. Рассмотрим такой программный код:
char short_string[5];
cout << "Enter some input:\n";
cin.getline(short_string, 5);
cout << short_string << "END OF OUTPUT\n";
ри выполнении его в составе полной программы можно получить приведенный ниже диалог.
Enter some input: dobedowap
dobeEND OF OUTPUT
Обратите внимание, что в строковую переменную short_string прочитаны четыре, а не пять символов, хотя вторым аргументом функции передано значение 5. Дело в том, что один элемент массива занят символом '\0'. Вы уже знаете, что им завершается каждая строка С и он всегда занимает один элемент массива.
Технологии ввода и вывода строк С посредством потоковых объектов cin и cout применимы и к файловым потоковым объектам. Входной поток cin можно заменить входным потоковым объектом, подключенным к файлу, а выходной поток cout можно заменить выходным потоковым объектом, подключенным к файлу. (О файловом вводе-выводе расскажу в лекции 16.)
Функция getline
Функция-член потоковых объектов getl ine может использоваться для чтения входной
строки и помещения ее в строковую переменную С.
Синтаксис
входной_поток.getline(строковая_переменная. максимальное_количество_символов + 1);
Из потока входной_поток считывается одна строка символов и помещается в переменную строковая_переменная. Если размер строки превышает максимальное_количество_симво-лов, будет прочитана только ее начальная часть, равная по длине этому значению. (Единица прибавляется, так как каждая строка С содержит нуль-символ '\0', отмечающий ее конец, и поэтому строка в переменной строковая_переменная на единицу длиннее прочитанной строки.)
Пример
char one_line[80]; cin.getline(one_line, 80);
(Точно так же можно вводить данные из входного потока, подключенного к файлу.)