C

strxfrm

strxfrm

在头文件中定义
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):

扩展内容

strcoll根据当前语言环境(函数)比较两个字符串
wcscoll(C95)根据当前语言环境(函数)比较两个宽字符串
STRCMP比较两个字符串(功能)
wcsxfrm(C95)转换宽字符串以使wcscmp产生与wcscoll(函数)相同的结果

| strxfrm的C ++文档 |