Строка (string)

From Valve Developer Community
< Ru
Jump to navigation Jump to search
English (en)Deutsch (de)Español (es)Русский (ru)中文 (zh)Translate (Translate)

Массивы char(en) (ASCII-символов) или wchar_t(en) (Unicode-символов) обычно используют для хранения текста. Такие данные выделены в отдельный тип строки. Они сложны и важны.

Нужно сделать: Explain string_t.

Строки с нулевым завершающим символом

Строки всегда на один символ больше, чем они есть. Дополнительный нулевой символ это терминатор строки (бинарный нуль, пишется как \0). Это необходимо, потому что обычно передаётся только указатель(en) на строку, а не сам массив.

Warning.pngПредупреждение:Указатель на строку не содержит информации о длине строки.

Без терминатора было бы сложно понимать, где строка заканчивается, а где начинается следующая переменная или нераспределённая память. Именно этор приводжит к переполнению буфера, и это очень плохо!

Tip.pngСовет:Нулевой терминатор не нужно включать как последний элемент массива. Байты после него будут просто проигнорированными функциями обработки строк.

Создание из текста

char* MyString = "Hello world"; // должен быть присвоен указатель!

Этот код создаёт строку из явно указанного текста (литерала). Двойные кавычки это специальный синтаксис, создающий массив char из содержащегося между ними текста. Поэтому указанный выше код:

  1. Выделяет произвольные 12 байтов памяти для хранение строки. По одному байту на каждый символ, плюс дополнительный двенадцатый байт для терминатора строки.
  2. Создаёт адресный char указатель, который хранит адрес первого символа (H в нашем случае).

Литералы часто передаются как константы (const). Потому что литерал останется в памяти до конца.

Note.pngПримечание:Если исследовать 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троки

Note.pngПримечание:Source исходно использует ASCII. Единственное, когда будете работать с Unicode, это при изучении внутренней работы графического интерфейса пользователя(en).

Unicode-строки аналогичны ASCII-строкам, но являются массивами wchar_t(en). Для работы с ними используется отдельный набор строковых функций, обычно с префиксом 'wc' или ' wcs '(wide char string) в их имени.

wchar_t* MyWideString = L"Здравей свят";

L помечает литерал как использующий Unicode. Это необходимо делать даже если все символы соответствуют ASCII.

Строковые функции

Есть множество функций для обработки строк, большинство из которых для ASCII имеют собственные для Source V_* эквиваленты. Более полный список смотрите в MSDN, или ищите "V_str" через VS' Class View.