Namespaces
Variants

strxfrm

From cppreference.net
< c ‎ | string ‎ | byte
Definido en el encabezado <string.h>
size_t strxfrm ( char * dest, const char * src, size_t count ) ;
(hasta C99)
size_t strxfrm ( char * restrict dest, const char * restrict src, size_t count ) ;
(desde C99)

Transforma la cadena de bytes terminada en nulo apuntada por src a la forma definida por la implementación de manera que comparar dos cadenas transformadas con strcmp produce el mismo resultado que comparar las cadenas originales con strcoll , en la configuración regional C actual.

Los primeros count caracteres de la cadena transformada se escriben en el destino, incluyendo el carácter nulo terminador, y se devuelve la longitud de la cadena transformada completa, excluyendo el carácter nulo terminador.

El comportamiento es indefinido si el dest array no es lo suficientemente grande. El comportamiento es indefinido si dest y src se superponen.

Si count es 0 , entonces dest puede ser un puntero nulo.

Contenidos

Notas

La longitud correcta del búfer que puede recibir toda la cadena transformada es 1 + strxfrm ( NULL , src, 0 )

Esta función se utiliza cuando se realizan múltiples comparaciones dependientes de la configuración regional utilizando la misma cadena o conjunto de cadenas, porque es más eficiente usar strxfrm para transformar todas las cadenas una sola vez, y posteriormente comparar las cadenas transformadas con strcmp .

Parámetros

dest - puntero al primer elemento del array donde se escribirá la cadena transformada
src - puntero al primer carácter de una cadena de bytes terminada en nulo a transformar
count - número máximo de caracteres a escribir

Valor de retorno

La longitud de la cadena transformada, sin incluir el carácter nulo terminador.

Ejemplo

#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);
}

Salida posible:

In the Czech locale: hrnec before chrt
In lexicographical comparison: chrt before hrnec

Referencias

  • Estándar C17 (ISO/IEC 9899:2018):
  • 7.24.4.5 La función strxfrm (p: 267)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 7.24.4.5 La función strxfrm (p: 366-367)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 7.21.4.5 La función strxfrm (p: 329-330)
  • Estándar C89/C90 (ISO/IEC 9899:1990):
  • 4.11.4.5 La función strxfrm

Véase también

compara dos cadenas de acuerdo a la configuración regional actual
(función)
(C95)
compara dos cadenas anchas de acuerdo a la configuración regional actual
(función)
compara dos cadenas
(función)
(C95)
transforma una cadena ancha para que wcscmp produzca el mismo resultado que wcscoll
(función)