Spec-Zone.ru › C

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

См. также

strcoll
сравнивает две строки в соответствии с текущей локалью
(функция)
wcscoll
(C95)
сравнивает две широкие строки в соответствии с текущей локалью
(функция)
strcmp
сравнивает две строки
(функция)
wcsxfrm
(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

Spec-Zone.ru

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