Ru/String: Difference between revisions
(первая версия перевода) |
(версия перевода 1.5) |
||
Line 28: | Line 28: | ||
# Создаёт локальный <code>char</code> [[pointer|указатель]] ,который хранит адрес первого символа (H в нашем случае). | # Создаёт локальный <code>char</code> [[pointer|указатель]] ,который хранит адрес первого символа (H в нашем случае). | ||
Строки литералы часто передаются переменной <code>[[W:const|const]]</code>. Потому что строка литерал останется в памяти до конца. | |||
{{Note:ru|Если вы изучите <code>MyString</code> в Visual Studio отладчике, то вы увидите сроку полностью. Это специальное поведение, чтобы облегчить изучение строки; грубо говоря, оно должно просто показать вам указатель (то есть первый символ, H).}} | {{Note:ru|Если вы изучите <code>MyString</code> в Visual Studio отладчике, то вы увидите сроку полностью. Это специальное поведение, чтобы облегчить изучение строки; грубо говоря, оно должно просто показать вам указатель (то есть первый символ, H).}} | ||
Line 45: | Line 45: | ||
Этот код выделяет две 12-байтовые строки, но не вставляет ничего в них (так что их содержание будет или пустым, или брехнёй). They need to be assigned to, ideally with a string function like <code>strcpy()</code> или <code>sprintf()</code>. | Этот код выделяет две 12-байтовые строки, но не вставляет ничего в них (так что их содержание будет или пустым, или брехнёй). They need to be assigned to, ideally with a string function like <code>strcpy()</code> или <code>sprintf()</code>. | ||
Разность между ними это то, что они создают массив в пространстве памяти функции, пока остальные создают указатель в функции и используют <code>[[W:new (C++)|new]]</code> для распределения их же строк в других местах. Преимущество <code>new</code> в том, что вы можете выделить массив размера, определенного во время выполнения, но плохо, что вы не скрупулёзны в вызове <code>[[W:delete (C++)|delete]]</code> (или <code>delete[]</code> массивов) или вы получите [ | Разность между ними это то, что они создают массив в пространстве памяти функции, пока остальные создают указатель в функции и используют <code>[[W:new (C++)|new]]</code> для распределения их же строк в других местах. Преимущество <code>new</code> в том, что вы можете выделить массив размера, определенного во время выполнения, но плохо, что вы не скрупулёзны в вызове <code>[[W:delete (C++)|delete]]</code> (или <code>delete[]</code> массивов) или вы получите [https://ru.wikipedia.org/wiki/%D0%A3%D1%82%D0%B5%D1%87%D0%BA%D0%B0_%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8 утечку памяти]. | ||
== Строки Unicode == | == Строки Unicode == | ||
Line 61: | Line 61: | ||
== Функии строки == | == Функии строки == | ||
Есть множество функций которые, обрабатывают строки, из которых большинство распространённых ASCII вариантов имеют специфические Source <code>V_*</code> эквиваленты. Смотрите [http://msdn.microsoft.com/en-us/library/f0151s4x.aspx MSDN] для более комплексного листа, или поищите VS' Просмотр Классов для "V_str". | |||
[[category:Variables]] | [[category:Variables]] | ||
[[Category:Glossary]] | [[Category:Glossary]] | ||
[[Category:Russian]] | [[Category:Russian]] |
Revision as of 12:15, 16 January 2021
Массивы char
(ASCII) или wchar_t
(Unicode) обычно используют для хранения текста. У этих хранилищ есть специальный термин: strings (строки), или иногда "C strings (строки)". Они сложны и важны.
Нулевой Терминатор
Строки всегда на один символ больше, чем они есть. Экстра-символ это Нулевой (бинарный нуль, пишется как \0
). Это необходимо, потому что pointer (указатель) на строку передаётся по кругу, а не полностью, указатель не содержит данных о длине строки.
Без терминатора было бы сложно понимать, где строка заканчивается, а где начинается следующая переменная, или нераспределённая память. Вот что такое переполнение буфера, и это очень плохо!
Создание из строкового литерала
char* MyString = "Hello world"; // должен быть присвоен указатель!
Этот код создаёт строку из строки литерала. Двойная квота помечает специальные синтаксисы, которые генерируют массив char
из его контента. Поэтому код выше:
- Назначает произвольные 12 байтов памяти на хранение строки. Это один на каждый символ, плюс автоматически делает двенадцатый для нулевого теринатора.
- Создаёт локальный
char
указатель ,который хранит адрес первого символа (H в нашем случае).
Строки литералы часто передаются переменной const
. Потому что строка литерал останется в памяти до конца.
Создание по размеру
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
Unicode начинают вести себя аналогично ASCII строкам, но заместо массиваwchar_t
. Они управляют самими собой Они управляются своим набороми строковых функций, обычно с 'wc' или ' wcs '(wide char string) в их имени.
wchar_t* MyWideString = L"Здравей свят";
L
помечает строку литерал как Unicode. Вам надо делать это хотя бы если все символы ASCII-совместимы.
Функии строки
Есть множество функций которые, обрабатывают строки, из которых большинство распространённых ASCII вариантов имеют специфические Source V_*
эквиваленты. Смотрите MSDN для более комплексного листа, или поищите VS' Просмотр Классов для "V_str".