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)
См. также
| сравнивает две строки с учётом текущей локали (функция) |
|
|
(C95) | сравнивает две широкие строки с учётом текущей локали (функция) |
|
(C95) | сравнивает две широкие строки (функция) |
| преобразует строку так, чтобы 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