Spec-Zone.ru › C

wcsxfrm

Определено в заголовочном файле <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)

См. также

strcoll
сравнивает две строки с учётом текущей локали
(функция)
wcscoll
(C95)
сравнивает две широкие строки с учётом текущей локали
(функция)
wcscmp
(C95)
сравнивает две широкие строки
(функция)
strxfrm
преобразует строку так, чтобы strcmp давала тот же результат, что и strcoll
(функция)
Документация C++ для wcsxfrm

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

Spec-Zone.ru

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