Spec-Zone.ru › C

wcsxfrm

Определено в заголовке <wchar.h>
size_t wcsxfrm( wchar_t* dest, const wchar_t* src, size_t count );
(до C99)
(с C95)
size_t wcsxfrm( wchar_t* restrict dest, const wchar_t* restrict src, size_t count );
(с C99)

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

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

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

Примечания

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

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

Параметры

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

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

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

Пример

#include <stdio.h>
#include <wchar.h>
#include <locale.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

Ссылки

  • Стандарт 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/w/c/string/wide/wcsxfrm

Spec-Zone.ru

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