strxfrm

< 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 所指向的空终止字节字符串为实现定义形式,满足当前 C 本地环境中,以 strcmp 比较二个变换后字符串给出与用 strcoll 比较源字符串相同的结果。

将变换后字符串的首 count 个字符写入目标,包含空终止字符,并返回排除空终止字符的完整转换后字符串的长度。

dest 数组不够大则行为未定义。若 destsrc 重叠则行为未定义。

count0 ,则允许 dest 为空指针。

在以同一字符串或字符串集合进行多个本地环境依赖的比较时,使用此函数,因为仅用 strxfrm 变换所有字符串一次,而以 strcmp 进行后继比较更为高效。

注意

能接收整个变换后字符串的正确缓冲区长度为 1+strxfrm(NULL, src, 0)

参数

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

引用

  • C11 standard (ISO/IEC 9899:2011):
  • 7.24.4.5 The strxfrm function (p: 366-367)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.21.4.5 The strxfrm function (p: 329-330)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 4.11.4.5 The strxfrm function

参阅

比较两个字符串,根据当前本地环境
(函数)
根据当前本地环境比较两个宽字符串
(函数)
比较两个字符串
(函数)
变换宽字符串,使得 wcscmp 会产生与 wcscoll 相同的结果
(函数)