Строки С++
В языке С++ есть все виды строк. Символьный тип char используется для задания отдельных символов. Для строк постоянной длины можно использовать массив символов - char[]. Особенностью, характерной для языка С++, точнее для языка С, является завершение строки символом с нулевым кодом. Строки, завершаемые нулем, называются обычно строками С. Массив char[] задает строку С и потому должен иметь размер, по крайней мере, на единицу больше фактического размера строки. Вот пример объявления подобных строк в С++:
//Массивы и строки char strM1[] = "Hello, World!"; char strM2[20] = "Yes";
Массив strM1 состоит из 14 символов, массив strM2 - из 20, но его четвертый символ имеет код 0, сигнализирующий о фактическом конце строки.
Другой способ задания строк С, заканчивающихся нулем, состоит в использовании типизированного указателя - char*.
//Строки, заданные указателем char* char* strPM1 ="Hello, World!"; char* strPM2;
Два типа, char[] и char*, допускают взаимные преобразования.
Не могу удержаться, чтобы не привести процедуру копирования строк, соответствующую духу и стилю С++:
void mycpy(char* p, const char* q) { while(*p++ = *q++); }
Эта процедура копирует содержимое строки q в строку p. В этой короткой программе, в которой, кроме условия цикла while, ничего больше нет, фактически используются многие средства языка С++ - разыменование указателей, адресная арифметика, присваивание как операция, завершение строки нулем, логическая интерпретация значений. Раз уж я привел эту программу, то поясню, как она работает. Вначале указатель q задает адрес начала строки, поэтому разыменование *q задает первый символ копируемой строки. Это значение присваивается первому символу строки p. Суффиксные операции p++ и q++ увеличивают значение указателей на единицу, но поскольку используется адресная арифметика, то в результате вычисляется адрес, задающий следующий символ соответствующих строк, и процесс копирования продолжается. При достижении последнего символа строки q - символа с кодом нуль - он также будет скопирован в строку p. Но в этот момент выражение присваивание впервые вернет в качестве значения результат 0, который будет проинтерпретирован в условии цикла while как false, и цикл завершит свою работу. Строка будет скопирована.
Можно восхищаться этой короткой и эффективной программой, можно ругать ее за сложность восприятия. Трудно назвать ее интуитивно понятной. Но во многом все определяется вкусом и привычкой.
Тип string не является частью языка С++, но входит в библиотеку, определяемую стандартом языка. Стандартные библиотеки, по сути, являются продолжением языка. Тип (класс) string обеспечивает работу со строками переменной длины и поддерживает многие полезные операции над строками.
Давайте разберемся, как устроены строки C# и что взято из языка С++.