Namespaces
Variants

wcsxfrm

来自 zh.cppreference.net
定义于头文件 <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 个字符被写入目标,包括终止空字符,并返回完整转换后字符串的长度,不包括终止空字符。

如果 count 是 0,则允许 dest 为空指针。

注解

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

当使用相同的宽字符串或一组宽字符串进行多次依赖于语言环境的比较时,会使用此函数,因为使用 wcsxfrm 一次转换所有字符串,然后使用 wcscmp 比较转换后的宽字符串更高效。

参数

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

返回值

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

示例

#include <locale.h>
#include <stdio.h>
#include <wchar.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

引用

  • C23 标准(ISO/IEC 9899:2024):
  • 7.29.4.4.4 wcsxfrm 函数(p: TBD)
  • C17 标准(ISO/IEC 9899:2018):
  • 7.29.4.4.4 wcsxfrm 函数(p: TBD)
  • 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