Namespaces
Variants

std:: wcsxfrm

From cppreference.net
Определено в заголовочном файле <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
(функция)
[virtual]
преобразует строку так, чтобы сортировка могла быть заменена сравнением
(виртуальная защищённая функция-член std::collate<CharT> )
сравнивает две широкие строки в соответствии с текущей локалью
(функция)