Символьные массивы (строки)
При объявлении символьного массива (типа char), даже в том случае, если мы не производим его инициализации и он является локальным, все элементы массива по-умолчанию получают значение нулей-терминаторов. При этом, метод cout, получающий в качестве аргумента указатель на символьный массив, начинает вывод на экран с элемента, связанного с данным указателем (т.е. с начального) и продолжает до первого встреченного нуля-терминатора.
Это позволяет нам отправлять на вывод символьный массив, не передавая методу cout его размера.
Признаком окончания вывода является символ нуля-терминатора ('\0').
Метод cin в качестве своего аргумента также может принимать указатель на символьный массив, куда будет записана строка введённая с клавиатуры, при этом, за последним элементом строки метод cin автоматически разместит нуль-терминатор. Более того, при задании строковой константы (когда строка явно задаётся в двойных кавычках в коде программы), вслед за последним символом в строке также автоматически размещается нуль-терминатор. Соответственно, длина строки будет на один символ больше, чем мы явно укажем.
char str[] = "Privet"; // в массиве 7 элементов: 6 латинских букв и нуль-терминатор cout << sizeof(str) << endl; // 7 cout << str << endl; // Privet - вывелась вся строка *(str+3) = '\0'; // вместо 'v' записали нуль-терминатор в массив cout << str << endl; // Pri - вывелась часть строки до нуль-терминатора
Обойти строку, обратившись по отдельности к каждому её символу, можно примерно так (в данном случае мы выведем на отдельной строке каждый символ и его код по символьной таблице):
char str[] = "Privet"; char* p = str; while(*p != '\0') { cout << *p << ' ' << (short) *p << endl; p++; }
Этого же результата можно было добиться более изящно (но менее понятно), совместив ряд операций (разыменование, инкремент, автопреведение к bool) в одной строке:
char str[] = "Privet"; char* p = str - 1; while(*p++) { cout << *p << ' ' << (short) *p << endl; }
