Строка (string)
You can help by finishing the translation.
Also, please make sure the article tries to comply with the alternate languages guide.Массивы char
(ASCII) или wchar_t (Юникод) обычно используют для хранения текста. У этих хранилищ есть специальный термин: strings (строки), или иногда «C strings (строки)». Они сложны и важны.
Нулевой Терминатор
Строки всегда на один символ больше, чем они есть. Экстра-символ это Нулевой (бинарный нуль, пишется как \0
). Это необходимо, потому что pointer (указатель) на строку передаётся по кругу, а не полностью, указатель не содержит данных о длине строки.
Без терминатора было бы сложно понимать, где строка заканчивается, а где начинается следующая переменная, или нераспределённая память. Вот что такое переполнение буфера, и это очень плохо!
Создание из строкового литерала
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-байтовые строки, но не вставляет ничего в них (так что их содержание будет или пустым, или брехнёй). They need to be assigned to, ideally with a string function like strcpy()
или sprintf().
Разность между ними это то, что они создают массив в пространстве памяти функции, пока остальные создают указатель в функции и используют new
для распределения их же строк в других местах. Преимущество new
в том, что вы можете выделить массив размера, определенного во время выполнения, но плохо, что вы не скрупулёзны в вызове delete
(или delete[]
массивов) или вы получите утечку памяти.
Строки Юникод
Юникод начинают вести себя аналогично ASCII строкам, но заместо массива wchar_t. Они управляют самими собой Они управляются своим набороми строковых функций, обычно с 'wc' или ' wcs '(wide char string) в их имени.
wchar_t* MyWideString = L"Здравей свят";
L
помечает строку литерал как Юникод. Вам надо делать это хотя бы если все символы ASCII-совместимы.
Функии строки
Есть множество функций которые, обрабатывают строки, из которых большинство распространённых ASCII вариантов имеют специфические Source V_*
эквиваленты. Смотрите MSDN для более комплексного листа, или поищите VS' Просмотр Классов для «V_str».