Namespaces
Variants

wcsxfrm

Из ru.cppreference.net
 
 
 
 
Определён в заголовочном файле <wchar.h>
size_t wcsxfrm( wchar_t* dest, const wchar_t* src, size_t count );
(начиная с C95)
(до C99)
size_t wcsxfrm( wchar_t* restrict dest, const wchar_t* restrict src, size_t count );
(начиная с C99)

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

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

Если count равно 0, то dest может быть нулевым указателем.

Примечания

Правильный размер буфера, который может вместить всю преобразованную строку, равен 1 + wcsxfrm(NULL, src, 0)

Эта функция используется при выполнении нескольких зависящих от локали сравнений с использованием одной и той же широкой строки или набора широких строк, поскольку эффективнее один раз преобразовать все строки с помощью wcsxfrm, а затем сравнивать преобразованные широкие строки с помощью wcscmp.

Параметры

dest — указатель на первый элемент широкой строки с нулевым завершением, в которую будет записана преобразованная строка
src — указатель на широкую строку с нулевым завершением, которую требуется преобразовать
count — максимальное количество символов для вывода

Возвращаемое значение

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

Пример

#include <locale.h>
#include <stdio.h>
#include <wchar.h>

int main(void)
{
    setlocale(LC_ALL, "sv_SE.utf8");

    const wchar_t* in1 = L"\u00e5r";
    wchar_t out1[1 + wcsxfrm(NULL, in1, 0)];
    wcsxfrm(out1, in1, sizeof out1/sizeof *out1);

    const wchar_t* in2 = L"\u00e4ngel";
    wchar_t out2[1 + wcsxfrm(NULL, in2, 0)];
    wcsxfrm(out2, in2, sizeof out2 / sizeof *out2);

    printf("In the Swedish locale: ");
    if (wcscmp(out1, out2) < 0)
        printf("%ls before %ls\n", in1, in2);
    else
        printf("%ls before %ls\n", in2, in1);

    printf("In lexicographical comparison: ");
    if (wcscmp(in1, in2) < 0)
        printf("%ls before %ls\n", in1, in2);
    else
        printf("%ls before %ls\n", in2, in1);
}

Вывод:

In the Swedish locale: år before ängel
In lexicographical comparison: ängel before år

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2024):
  • 7.29.4.4.4 Функция wcsxfrm (стр. TBD)
  • Стандарт C17 (ISO/IEC 9899:2018):
  • 7.29.4.4.4 Функция wcsxfrm (стр. TBD)
  • Стандарт C11 (ISO/IEC 9899:2011):
  • 7.29.4.4.4 Функция wcsxfrm (стр. 434-435)
  • Стандарт C99 (ISO/IEC 9899:1999):
  • 7.24.4.4.4 Функция wcsxfrm (стр. 380-381)

Смотрите также

сравнивает две строки в соответствии с текущей локалью
(функция)
сравнивает две широкие строки в соответствии с текущей локалью
(функция)
(C95)
сравнивает две широкие строки
(функция)
преобразует строку так, что strcmp даёт тот же результат, что и strcoll
(функция)