Ru/String

From Valve Developer Community
< Ru
Revision as of 12:07, 16 January 2021 by TheHammerUser (talk | contribs) (первая версия перевода)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Template:Otherlang2

Массивы char (ASCII) или wchar_t (Unicode) обычно используют для хранения текста. У этих хранилищ есть специальный термин: strings (строки), или иногда "C strings (строки)". Они сложны и важны.

Нулевой Терминатор

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

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

Template:Note:ru

Создание из строкового литерала

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

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

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

String literals are often handed with const variables. This is because a string literal will stay in memory for the process's whole lifespan.

Template:Note:ru

Создание по размеру

char MyString[12]; // позволяет только статический размер

int StringLen = 12;
char* pMyString = new char[StringLen]; // позволяет вставить размер из переменной

delete[] pMyString; // всегда удаляет (delete / delete[]) всё созданное с 'new' после использования

Этот код выделяет две 12-байтовые строки, но не вставляет ничего в них (так что их содержание будет или пустым, или брехнёй). They need to be assigned to, ideally with a string function like strcpy() или sprintf().

Разность между ними это то, что они создают массив в пространстве памяти функции, пока остальные создают указатель в функции и используют new для распределения их же строк в других местах. Преимущество new в том, что вы можете выделить массив размера, определенного во время выполнения, но плохо, что вы не скрупулёзны в вызове delete (или delete[] массивов) или вы получите утечку памяти.

Строки Unicode

Template:Note:ru

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

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

L помечает строку литерал как Unicode. Вам надо делать это хотя бы если все символы ASCII-совместимы.

Функии строки

There are a multitude of functions which process strings, of which the most common ASCII variants have Source-specific V_* equivalents. See MSDN for a quite comprehensive list, or search VS' Class View for "V_str".