Namespaces
Variants

strxfrm

From cppreference.net
< 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 比较两个转换后的字符串,与在当前 C 语言区域设置下用 strcoll 比较原始字符串的结果相同。

转换后的字符串前 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 函数 (页码: 366-367)
  • C99标准(ISO/IEC 9899:1999):
  • 7.21.4.5 strxfrm函数(页码:329-330)
  • C89/C90 标准 (ISO/IEC 9899:1990):
  • 4.11.4.5 strxfrm 函数

参见

根据当前区域设置比较两个字符串
(函数)
(C95)
根据当前区域设置比较两个宽字符串
(函数)
比较两个字符串
(函数)
(C95)
转换宽字符串,使得 wcscmp 能产生与 wcscoll 相同的结果
(函数)
C++ 文档 关于 strxfrm