Spec-Zone.ru › C++

std::wcsxfrm

Defined in header <cwchar>
std::size_t wcsxfrm( wchar_t* dest, const wchar_t* src, std::size_t count );

Преобразует строку широких символов с нулевым завершением, на которую указывает src, в определённую реализацией форму, такую, что сравнение двух преобразованных строк с std::wcscmp даёт тот же результат, что и сравнение исходных строк с std::wcscoll, в текущей локали C.

Первые count символов преобразованной строки записываются в место назначения, включая завершающий нулевой символ, и возвращается длина полной преобразованной строки, исключая завершающий нулевой символ.

Если 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

См. также

strxfrm
преобразовать строку таким образом, что strcmp даст тот же результат, что и strcoll
(функция)
do_transform
[virtual]
преобразует строку, чтобы сортировку можно было заменить сравнением
(виртуальная защищенная функция-член std::collate<CharT>)
wcscoll
сравнивает две строки широких символов в соответствии с текущей локалью
(функция)
C документация для wcsxfrm

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/string/wide/wcsxfrm

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API