命名空间
变体
操作

wcsxfrm

来自 cppreference.com
< c‎ | string‎ | wide
定义在头文件 <wchar.h>
size_t wcsxfrm( wchar_t* dest, const wchar_t* src, size_t count );
(直到 C99)
(自 C95)
size_t wcsxfrm( wchar_t* restrict dest, const wchar_t* restrict src, size_t count );
(自 C99)

将由 src 指向的以空字符结尾的宽字符串转换为实现定义的形式,这样使用 wcscmp 比较两个转换后的字符串将给出与使用 wcscoll 比较原始字符串相同的结果,在当前的 C 本地化环境中。

转换后的字符串的前 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 标准 (ISO/IEC 9899:2011)
  • 7.29.4.4.4 wcsxfrm 函数 (p: 434-435)
  • C99 标准 (ISO/IEC 9899:1999)
  • 7.24.4.4.4 wcsxfrm 函数 (p: 380-381)

[编辑] 参见

根据当前本地化环境比较两个字符串
(函数) [编辑]
根据当前本地化环境比较两个宽字符串
(函数) [编辑]
(C95)
比较两个宽字符串
(函数) [编辑]
转换字符串,以便 strcmp 的结果与 strcoll 相同
(函数) [编辑]
C++ 文档 用于 wcsxfrm