В С++ используются два вида строк: а) строка как массив символов типа char; б) строка как объект класса string. В этом семестре мы остановимся на изучении строк как массива элементов типа char. По сравнению со string он более примитивен и легко понимается.
Итак, строка представляет собой массив символов, заканчивающийся нуль-символом (нулевым символом). Нуль-символ – это символ с кодом в ASCII, равным 0, что записывается в виде управляющей последовательности '\0'. По положению нуль-символа определяется фактическая длина строки. Как и другие типы данных, строки могут быть переменными и константными.
Строку можно инициализировать следующим образом: char str[10] = "Vasia";. В этом примере под строку выделяется 10 байт (1 символ – 1 байт), 5 из которых занято под символы строки, а шестой – под нуль-символ:
Если строка при определении инициализируется, её размерность можно опускать (компилятор сам выделит соответствующее количество байт):
char str[ ] = "Vasia"; // выделено и заполнено 6 байт
Рассмотрим элементарную программу, осуществляющую ввод и вывод строки:
int main() {
const int MAX = 10; // максимальный размер строки
char str[MAX]; // сама строка
cout << "Vvedite stroku: "; // ввод строки
cin >> str;
cout << "Vy vveli: " << str << endl; // показ результата
getch(); return 0;
}
Данная программа отражает принцип описания строк и имеет ряд недостатков. Во-первых, может произойти ошибка из-за того, что пользователь введёт строку, которая окажется длиннее, чем массив, используемый для её хранения. Необходимо помнить, что в С++ нет встроенного механизма, защищающего программу от помещения элементов за пределы массива. Однако существует масса возможностей ограничить количество символов, помещаемых в массив. Во-вторых, если в данной программе ввести строку, содержащую более одного слова, то программа выведет только первое слово. Это вызвано тем, что операция >> считает пробел нулевым символом, и всё напечатанное после пробела отбрасывается. Приведём пример, исправляющий указанные недостатки:
int main() {
const int MAX = 10; // максимальный размер строки
char str[MAX]; // сама строка
cout << "Vvedite stroku: "; // ввод строки
cin.get(str, MAX);
cout << "Vy vveli: " << str << endl; // показ результата
getch(); return 0;
}
В данной версии программы, для считывания строк, содержащих пробелы, мы применили метод cin.get(str, MAX); . Здесь, первый аргумент определяет адрес массива, куда будет помещена введённая строка, а второй аргумент определяет максимальный размер массива, автоматически предупреждая, таким образом, его переполнение. Существует ещё метод cin.getline(), который работает аналогично cin.get(), но не оставляет в потоке символ перевода строки '\n', вместо которого записывается завершающий 0.
Метод cin.get(); может иметь третий аргумент, позволяющий решать проблему считывания нескольких строк. Этот аргумент определяет символ, на котором метод завершает считывание строки. Пример:
int main() {
const int MAX = 200; // максимальный размер строки
char str[MAX]; // сама строка
cout << "Vvedite Vashe polnoe imya i adres v neskolko strok: "; // ввод строки
cin.get(str, MAX, '$');
cout << "Vy vveli: " << str << endl; // показ результата
getch(); return 0;
}
Здесь, метод cin.get(str, MAX, '$'); обеспечивает принятие символов до тех пор, пока вы не введёте завершающий символ (или до тех пор, пока вводимые данные не превысят размер массива). Результат работы программы:
Vvedite Vashe polnoe imya i adres v neskolko strok: Ivanov
Ivan Petrovich
g. Moskva, ul. Sadovaja, 10
$
Vy vveli: Ivanov
Ivan Petrovich
g. Moskva, ul. Sadovaja, 10