strxfrm
来自 cppreference.com
在头文件 <string.h> 中定义 |
||
(直到 C99) | ||
(从 C99 开始) | ||
将 src
指向的以空字符结尾的字节字符串转换为实现定义的形式,以便使用 strcmp 比较两个转换后的字符串会得到与使用 strcoll 比较原始字符串相同的结果,在当前 C 区域设置中。
转换后的字符串的前 count
个字符将写入目标,包括终止的空字符,并返回完整转换后的字符串的长度,不包括终止的空字符。
如果 dest
数组不足够大,则行为未定义。如果 dest
和 src
重叠,则行为未定义。
如果 count
是 0,则 dest
可以是空指针。
内容 |
[编辑] 注释
可以接收整个转换字符串的缓冲区的正确长度为 1+strxfrm(NULL, src, 0)
当使用相同字符串或一组字符串进行多次与区域设置相关的比较时,使用此函数,因为使用 strxfrm
只需转换一次所有字符串,然后使用 strcmp 比较转换后的字符串,效率更高。
[编辑] 参数
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
[编辑] 参考文献
- C17 标准 (ISO/IEC 9899:2018)
- 7.24.4.5 strxfrm 函数 (p: 267)
- 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 函数
[编辑] 另请参见
根据当前区域设置比较两个字符串 (函数) | |
(C95) |
根据当前区域设置比较两个宽字符串 (函数) |
比较两个字符串 (函数) | |
(C95) |
转换宽字符串,以便 wcscmp 会产生与 wcscoll 相同的结果 (函数) |
C++ 文档 for strxfrm
|