std::wcsxfrm
Определено в заголовочном файле <cwchar> | ||
|---|---|---|
std::size_t wcsxfrm( wchar_t* dest, const wchar_t* src, std::size_t count ); |
Преобразует широкую строку с завершающим нулевым символом, на которую указывает src, в форму, определяемую реализацией, так что сравнение двух преобразованных строк с помощью std::wcscmp дает тот же результат, что и сравнение исходных строк с помощью std::wcscoll в текущей локали C.
Первые count символов преобразованной строки записываются в destination, включая завершающий нулевой символ, а длина полной преобразованной строки возвращается без учета завершающего нулевого символа.
Если count равно 0, то dest может быть нулевым указателем.
Примечания
Требуемая длина буфера, в который может поместиться вся преобразованная строка, составляет 1 + std::wcsxfrm(nullptr, src, 0).
Эта функция используется при выполнении нескольких сравнений, зависящих от локали, с одной и той же широкой строкой или набором широких строк, поскольку эффективнее один раз преобразовать все строки с помощью std::wcsxfrm, а затем сравнивать преобразованные широкие строки с помощью std::wcscmp.
Параметры
| dest | - | указатель на первый элемент широкой строки с завершающим нулевым символом, в которую записывается преобразованная строка |
| src | - | указатель на широкую строку с завершающим нулевым символом, которую нужно преобразовать |
| count | - | максимальное количество символов для вывода |
Возвращаемое значение
Длина преобразованной широкой строки без учета завершающего нулевого символа.
Пример
#include <cwchar>
#include <iostream>
int main()
{
std::setlocale(LC_ALL, "sv_SE.utf8");
std::wstring in1 = L"\u00e5r";
std::wstring out1(1 + std::wcsxfrm(nullptr, in1.c_str(), 0), L' ');
std::wstring in2 = L"\u00e4ngel";
std::wstring out2(1 + std::wcsxfrm(nullptr, in2.c_str(), 0), L' ');
std::wcsxfrm(&out1[0], in1.c_str(), out1.size());
std::wcsxfrm(&out2[0], in2.c_str(), out2.size());
std::wcout << "In the Swedish locale: ";
if (out1 < out2)
std::wcout << in1 << " before " << in2 << '\n';
else
std::wcout << in2 << " before " << in1 << '\n';
std::wcout << "In lexicographical comparison: ";
if (in1 < in2)
std::wcout << in1 << " before " << in2 << '\n';
else
std::wcout << in2 << " before " << in1 << '\n';
}
Вывод:
In the Swedish locale: år before ängel In lexicographical comparison: ängel before år
См. также
преобразует строку так, чтобы strcmp давала тот же результат, что и strcoll (функция) |
|
|
[виртуальная] | преобразует строку, чтобы сравнение могло заменить упорядочивание (виртуальная защищенная функция-член std::collate<CharT>) |
| сравнивает две широкие строки в соответствии с текущей локалью (функция) |
|
Документация C для wcsxfrm |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/string/wide/wcsxfrm