非常教程

C参考手册

字符串 | Strings

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指向的以null结尾的字节串转换为实现定义的表单,以便在当前C语言环境中将两个转换后的字符串与strcmp进行比较,得出的结果与将原始字符串与strcoll进行比较的结果相同。

count转换后的字符串的第一个字符写入目标,包括终止空字符,并返回完整转换的字符串的长度,不包括终止空字符。

如果dest数组不够大,行为是不确定的。 如果dest和src重叠,则行为不确定。

如果count为0,则允许dest为空指针。

注意

可以接收整个转换字符串的缓冲区的正确长度为1 + strxfrm(NULL,src,0)。

参数

dest

-

指向将写入转换后的字符串的数组的第一个元素的指针

SRC

-

指向要转换的以空字符结尾的字节字符串的第一个字符的指针

count

-

要写入的最大字符数

返回值

转换后的字符串的长度,不包括终止的空字符。

当使用相同的字符串或字符串集合进行多个与区域相关的比较时,会使用此函数,因为使用strxfrm将所有字符串转换一次,然后将转换后的字符串与strcmp进行比较效率更高。

#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标准(ISO / IEC 9899:2011):
    • 7.24.4.5 strxfrm函数(p:366-367)
  • C99标准(ISO / IEC 9899:1999):
    • 7.21.4.5 strxfrm函数(p:329-330)
  • C89 / C90标准(ISO / IEC 9899:1990):
    • 4.11.4.5 strxfrm函数

扩展内容

strcoll

根据当前语言环境(函数)比较两个字符串

wcscoll(C95)

根据当前语言环境(函数)比较两个宽字符串

STRCMP

比较两个字符串(功能)

wcsxfrm(C95)

转换宽字符串以使wcscmp产生与wcscoll(函数)相同的结果

| strxfrm的C ++文档 |

C

C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。