Объявление и инициализация L-строки

L-строки, являются массивами, содержащими символы типа wchar_t. Последним символом L-строки является нулевой символ. Объявляется L-строка также как и массив элементов типа wchar_t:

wchar_t str[6];

При инициализации L-строки можно перечислить широкие символы внутри фигурных скобок или указать строку внутри двойных кавычек, перед которыми добавлена буква L:

wchar_t str1[6] = { L'т', L'е', L'к', L'с', L'т', L'\0' };
wchar_t str2[] = { L'\u0442', L'\u0435', L'\u043A',
                   L'\u0441', L'\u0442', L'\0' };
wchar_t str3[] = { 1090, 1077, 1082, 1089, 1090, 0 };
wchar_t str4[] = L"\u0442\u0435\u043A\u0441\u0442";
wchar_t str5[] = L"текст";

При использовании двойных кавычек следует учитывать, что длина строки на один символ больше, так как в конец будет автоматически вставлен нулевой символ. Если это не предусмотреть и объявить массив из пяти элементов, вместо шести, то это приведет к ошибке.

Обратите внимание на то, что присваивать строку в двойных кавычках можно только при инициализации. Попытка присвоить строку позже приведет к ошибке:

wchar_t str[7];
str = L"String"; // Ошибка!!!

В этом случае нужно воспользоваться функцией wcscpy() или wcscpy_s():

wchar_t str[7];
wcscpy_s(str, 7, L"String");
std::wcout << str << std::endl; // String

Внутри строки в двойных кавычках можно указывать специальные символы (например, \n, \r и др.), которые мы уже рассматривали в разд. 7.1. Если внутри строки встречается кавычка, то ее необходимо экранировать с помощью обратного слэша:

_wsetlocale(LC_ALL, L"Russian_Russia.1251");
wchar_t str[] = L"Группа \"Кино\"\n";
std::wcout << str << std::endl; // Группа "Кино"

Если внутри строки встречается обратный слэш, то его необходимо экранировать. Это обязательно следует учитывать при указании пути к файлу:

wchar_t str1[] = L"C:\\temp\\new\\file.txt"; // Правильно
wchar_t str2[] = L"C:\temp\new\file.txt";    // Неправильно!!!
std::wcout << str1 << std::endl; // C:\temp\new\file.txt
std::wcout << str2 << std::endl; // Строка с ошибками!!!

Обратите внимание на вторую строку. В этом пути присутствуют сразу три специальных символа: \t, \n и \f. После преобразования специальных символов путь будет выглядеть следующим образом:

C:<Табуляция>emp<Перевод строки>ew<Перевод формата>ile.txt

Начиная со стандарта C++11, язык C++ поддерживает raw-строки, внутри которых специальные символы трактуются как комбинации обычных символов, поэтому их экранировать не нужно. Форматы raw-строк:

LR"(текст строки)"
LR"символы(текст строки)символы"

При использовании первого формата текст строки указывается между отрывающей комбинацией символов LR"( и закрывающей комбинацией символов )":

std::wcout << LR"(текст строки\n)" << std::endl; // текст строки\n

Обратите внимание, символ перевода строки \n трактуется как комбинация двух символов \ и n, а не как специальный символ.

Второй формат позволяет дополнительно указать произвольные символы-разделители, например, три точки. Благодаря этим символам мы можем в тексте строки использовать любые символы без опасения, что они случайно станут закрывающей строку комбинацией символов. Пример указания пути к файлу с помощью raw-строки:

wchar_t path[] = LR"...(C:\temp\new\file.txt)..."; // Правильно
std::wcout << path << std::endl; // C:\temp\new\file.txt

Разместить L-строку при инициализации на нескольких строках нельзя. Переход на новую строку вызовет синтаксическую ошибку:

wchar_t str[] = L"string1
string2"; // Ошибка!!!

Чтобы разместить L-строку на нескольких строках, следует перед символом перевода строки указать символ \:

wchar_t str[] = L"string1 \
string2 \
string3"; // После символа \ не должно быть никаких символов
std::wcout << str << std::endl; // string1 string2 string3

Можно также воспользоваться raw-строками, но символы перевода строки в исходном коде будут вставлены в строку:

wchar_t str[] = LR"...(string1
string2
string3)...";
std::wcout << str << std::endl;

Результат:

string1
string2
string3

Кроме того, можно воспользоваться неявной конкатенацией. Если строки расположены подряд внутри одной инструкции, то они объединяются в одну большую строку. Пример:

wchar_t str[] = L"string1"
L"string2" L"string3";
std::wcout << str << std::endl; // string1string2string3

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов