strxfrm
Определено в заголовочном файле <string.h> | ||
|---|---|---|
size_t strxfrm( char *dest, const char *src, size_t count ); | (до C99) | |
size_t strxfrm( char *restrict dest, const char *restrict src, size_t count ); | (начиная с C99) |
Преобразует строку байтов, завершающуюся нулём, на которую указывает src, в определённую реализацией форму таким образом, что сравнение двух преобразованных строк с помощью strcmp даёт тот же результат, что и сравнение исходных строк с помощью strcoll, в текущей локали C.
Первые count символов преобразованной строки записываются в место назначения, включая завершающий нулевой символ, а длина всей преобразованной строки возвращается, исключая завершающий нулевой символ.
Поведение является неопределённым, если массив dest недостаточно велик. Поведение является неопределённым, если dest и src перекрываются.
Если count равно 0, то dest может быть указателем на null.
Примечания
Правильная длина буфера, который может принять всю преобразованную строку, составляет 1+strxfrm(NULL, src, 0)
Эта функция используется при выполнении многократных сравнений, зависящих от локали, с использованием одной и той же строки или набора строк, поскольку более эффективно использовать strxfrm для преобразования всех строк один раз и впоследствии сравнивать преобразованные строки с помощью strcmp.
Параметры
| dest | - | указатель на первый элемент массива, в который будет записана преобразованная строка |
| src | - | указатель на первый символ строки байтов, завершающейся нулём, подлежащей преобразованию |
| count | - | максимальное количество символов для записи |
Возвращаемое значение
Длина преобразованной строки без завершающего нулевого символа.
Пример
#include <stdio.h>
#include <string.h>
#include <locale.h>
int main(void)
{
setlocale(LC_COLLATE, "cs_CZ.iso88592");
const char *in1 = "hrnec";
char out1[1+strxfrm(NULL, in1, 0)];
strxfrm(out1, in1, sizeof out1);
const char *in2 = "chrt";
char out2[1+strxfrm(NULL, in2, 0)];
strxfrm(out2, in2, sizeof out2);
printf("In the Czech locale: ");
if(strcmp(out1, out2) < 0)
printf("%s before %s\n",in1, in2);
else
printf("%s before %s\n",in2, in1);
printf("In lexicographical comparison: ");
if(strcmp(in1, in2)<0)
printf("%s before %s\n",in1, in2);
else
printf("%s before %s\n",in2, in1);
}Возможный вывод:
In the Czech locale: hrnec before chrt In lexicographical comparison: chrt before hrnec
Ссылки
- Стандарт C17 (ISO/IEC 9899:2018):
- 7.24.4.5 Функция strxfrm (стр. 267)
- Стандарт C11 (ISO/IEC 9899:2011):
- 7.24.4.5 Функция strxfrm (стр. 366-367)
- Стандарт C99 (ISO/IEC 9899:1999):
- 7.21.4.5 Функция strxfrm (стр. 329-330)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
- 4.11.4.5 Функция strxfrm
См. также
| сравнивает две строки в соответствии с текущей локалью (функция) |
|
|
(C95) | сравнивает две широкие строки в соответствии с текущей локалью (функция) |
| сравнивает две строки (функция) |
|
|
(C95) | преобразует широкую строку таким образом, что wcscmp даст тот же результат, что и wcscoll (функция) |
Документация C++ для strxfrm |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/string/byte/strxfrm