Строка (string)
Массивы char (
ASCII-символов) или wchar_t (
Unicode-символов) обычно используют для хранения текста. Такие данные выделены в отдельный тип
строки. Они сложны и важны.
Строки с нулевым завершающим символом
Строки всегда на один символ больше, чем они есть. Дополнительный нулевой символ это терминатор строки (бинарный нуль, пишется как \0). Это необходимо, потому что обычно передаётся только указатель на строку, а не сам массив.
Без терминатора было бы сложно понимать, где строка заканчивается, а где начинается следующая переменная или нераспределённая память. Именно этор приводжит к переполнению буфера, и это очень плохо!
Создание из текста
char* MyString = "Hello world"; // должен быть присвоен указатель!
Этот код создаёт строку из явно указанного текста (литерала). Двойные кавычки это специальный синтаксис, создающий массив char из содержащегося между ними текста. Поэтому указанный выше код:
- Выделяет произвольные 12 байтов памяти для хранение строки. По одному байту на каждый символ, плюс дополнительный двенадцатый байт для терминатора строки.
- Создаёт адресный
charуказатель, который хранит адрес первого символа (H в нашем случае).
Литералы часто передаются как
константы (const). Потому что литерал останется в памяти до конца.
MyString в отладчике Visual Studio, то можно увидеть сроку полностью. Это специальное поведение, чтобы облегчить изучение строки; грубо говоря, оно должно просто показать вам указатель (то есть первый символ, H).Создание по размеру
char MyString[12]; // позволяет только ограниченный размер
int StringLen = 12;
char* pMyString = new char[StringLen]; // позволяет задать размер из переменной
delete[] pMyString; // всегда удаляет (delete / delete[]) всё созданное с 'new' после использования
Этот код выделяет две 12-байтовые строки, но не вставляет ничего в них (их содержимое будет или пустым, или мусором). Для присвоения значений идеально подходят строковые функции strcpy() или sprintf().
Разница между ними в том, что одна функция создает массив в области памяти функции, а другая - указатель внутри функции и использует оператор
new для размещения самой строки в другом месте. Преимущество new в том, что можно выделить массив необходимого размера непосредственно во время выполнения, но недостатком является то, что неправильный использование
delete (или delete[] для массивов) приведёт к
утечке памяти.
Unicode-cтроки
Unicode-строки аналогичны ASCII-строкам, но являются массивами wchar_t. Для работы с ними используется отдельный набор строковых функций, обычно с префиксом 'wc' или ' wcs '(wide char string) в их имени.
wchar_t* MyWideString = L"Здравей свят";
L помечает литерал как использующий Unicode. Это необходимо делать даже если все символы соответствуют ASCII.
Строковые функции
Есть множество функций для обработки строк, большинство из которых для ASCII имеют собственные для Source V_* эквиваленты. Более полный список смотрите в MSDN, или ищите "V_str" через VS' Class View.