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 ++文档 |