Строка (string)

From Valve Developer Community
< Ru
Revision as of 17:14, 6 August 2023 by Pee (talk | contribs)
Jump to navigation Jump to search
English (en)Deutsch (de)Español (es)Русский (ru)中文 (zh)Translate (Translate)
Info content.png
This page has not been fully translated.
You can help by finishing the translation.
If this page cannot be translated for some reason, or is left untranslated for an extended period of time after this notice is posted, the page should be requested to be deleted.
Also, please make sure the article complies with the alternate languages guide.(en)

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

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

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

Warning icon.png
This article has been marked as a candidate for speedy deletion for the following reason:
Use {{Flag|en}} instead.
If you object to this decision, then please discuss why here (If you make a discussion section also create this redirect page). If this page doesn't meet the criteria for speedy deletion, then please remove this notice, but do not remove it from pages that you have created yourself
Administrators / Moderators - Remember to check if anything links here and the page history before deleting.

(указатель) на строку передаётся по кругу, а не полностью, указатель не содержит данных о длине строки.

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

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

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

Этот код создаёт строку из строки литерала

Warning icon.png
This article has been marked as a candidate for speedy deletion for the following reason:
Use {{Flag|en}} instead.
If you object to this decision, then please discuss why here (If you make a discussion section also create this redirect page). If this page doesn't meet the criteria for speedy deletion, then please remove this notice, but do not remove it from pages that you have created yourself
Administrators / Moderators - Remember to check if anything links here and the page history before deleting.

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

  1. Назначает произвольные 12 байтов памяти на хранение строки. Это один на каждый символ, плюс автоматически делает двенадцатый для нулевого теринатора.
  2. Создаёт локальный char указатель
Warning icon.png
This article has been marked as a candidate for speedy deletion for the following reason:
Use {{Flag|en}} instead.
If you object to this decision, then please discuss why here (If you make a discussion section also create this redirect page). If this page doesn't meet the criteria for speedy deletion, then please remove this notice, but do not remove it from pages that you have created yourself
Administrators / Moderators - Remember to check if anything links here and the page history before deleting.

, который хранит адрес первого символа (H в нашем случае).

Строки литералы часто передаются переменной const. Потому что строка литерал останется в памяти до конца. 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[] массивов) или вы получите утечку памяти.

Строки Юникод

Template:Note:ru

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

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

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

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

Есть множество функций которые, обрабатывают строки, из которых большинство распространённых ASCII вариантов имеют специфические Source V_* эквиваленты. Смотрите MSDN для более комплексного листа, или поищите VS' Просмотр Классов для «V_str».