C 参考手册

定义于头文件 <wchar.h>
size_t wcsxfrm( wchar_t* dest, const wchar_t* src, size_t count );
(C95 起)
(C99 前)
size_t wcsxfrm( wchar_t* restrict dest, const wchar_t* restrict src, size_t count );
(C99 起)

变换 src 所指向的空终止宽字符串为实现定义形式,满足在当前 C 本地环境中,用 wcscmp 比较二个变换后的字符串给出的结果与用 wcscoll 比较源字符串者相同。

将变换后字符串的首 count 个字符写入目标,包含空终止符,并返回完整的变换后字符串长度,排除空终止符。

count0 ,则允许 dest 为空指针。

注意

能接收整个变换后字符串的正确缓冲区长度是 1+wcsxfrm(NULL, src, 0)

在以同一宽字符串或宽字符串集进行本地环境依赖比较时使用此函数,因为只用 wcsxfrm 变换所有字符串一次,再以 wcscmp 进行后续比较更为高效。

参数

dest - 指向要写入变换后字符串到的空终止宽字符数组首元素的指针
src - 指向要变换的空终止宽字符串的指针
count - 要输出的最大字符数

返回值

变换后的空终止宽字符串的长度,不包含空终止字符。

示例

#include <stdio.h>
#include <wchar.h>
#include <locale.h>
 
int main(void)
{
    setlocale(LC_ALL, "sv_SE.utf8");
 
    const wchar_t *in1 = L"\u00e5r";
    wchar_t out1[1+wcsxfrm(NULL, in1, 0)];
    wcsxfrm(out1, in1, sizeof out1/sizeof *out1);
 
    const wchar_t *in2 = L"\u00e4ngel";
    wchar_t out2[1+wcsxfrm(NULL, in2, 0)];
    wcsxfrm(out2, in2, sizeof out2/sizeof *out2);
 
    printf("In the Swedish locale: ");
    if(wcscmp(out1, out2) < 0)
         printf("%ls before %ls\n", in1, in2);
    else
         printf("%ls before %ls\n", in2, in1);
 
    printf("In lexicographical comparison: ");
    if(wcscmp(in1, in2) < 0)
         printf("%ls before %ls\n", in1, in2);
    else
         printf("%ls before %ls\n", in2, in1);
}

输出:

In the Swedish locale: år before ängel
In lexicographical comparison: ängel before år

引用

  • C11 standard (ISO/IEC 9899:2011):
  • 7.29.4.4.4 The wcsxfrm function (p: 434-435)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.24.4.4.4 The wcsxfrm function (p: 380-381)

参阅

比较两个字符串,根据当前本地环境
(函数)
根据当前本地环境比较两个宽字符串
(函数)
(C95)
比较两个宽字符串
(函数)
变换字符串,使得 strcmp 会产生同 strcoll 的结果
(函数)