命名空间
变体
操作

strxfrm

来自 cppreference.com
< 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 指向的以空字符结尾的字节字符串转换为实现定义的形式,以便使用 strcmp 比较两个转换后的字符串会得到与使用 strcoll 比较原始字符串相同的结果,在当前 C 区域设置中。

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

如果 dest 数组不足够大,则行为未定义。如果 destsrc 重叠,则行为未定义。

如果 count0,则 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 函数

[编辑] 另请参见

根据当前区域设置比较两个字符串
(函数) [编辑]
根据当前区域设置比较两个宽字符串
(函数) [编辑]
比较两个字符串
(函数) [编辑]
转换宽字符串,以便 wcscmp 会产生与 wcscoll 相同的结果
(函数) [编辑]
C++ 文档 for strxfrm