Namespaces
Variants

strxfrm

From cppreference.net
< c ‎ | string ‎ | byte
Определено в заголовке <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 может быть нулевым указателем.

Содержание

Примечания

Правильная длина буфера, которая может принять всю преобразованную строку, равна 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
(функция)