命名空间
变体
操作

std::wcsxfrm

来自 cppreference.cn
< cpp‎ | string‎ | wide
定义于头文件 <cwchar>
std::size_t wcsxfrm( wchar_t* dest, const wchar_t* src, std::size_t count );

src 指向的空终止宽字符串转换为实现定义的格式,以便使用 std::wcscmp 比较两个转换后的字符串会得到与使用 std::wcscoll 比较原始字符串相同的结果,在当前的 C 语言环境中。

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

如果 count0,则允许 dest 为空指针。

目录

[编辑] 注释

可以接收完整转换后字符串的缓冲区的正确长度是 1 + std::wcsxfrm(nullptr, src, 0)

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

[编辑] 参数

dest - 指向宽空终止字符串的第一个元素的指针,转换后的字符串将写入到这里
src - 指向要转换的空终止宽字符字符串的指针
count - 要输出的最大字符数

[编辑] 返回值

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

[编辑] 示例

#include <cwchar>
#include <iostream>
 
int main()
{
    std::setlocale(LC_ALL, "sv_SE.utf8");
 
    std::wstring in1 = L"\u00e5r";
    std::wstring out1(1 + std::wcsxfrm(nullptr, in1.c_str(), 0), L' ');
    std::wstring in2 = L"\u00e4ngel";
    std::wstring out2(1 + std::wcsxfrm(nullptr, in2.c_str(), 0), L' ');
 
    std::wcsxfrm(&out1[0], in1.c_str(), out1.size());
    std::wcsxfrm(&out2[0], in2.c_str(), out2.size());
 
    std::wcout << "In the Swedish locale: ";
    if (out1 < out2)
        std::wcout << in1 << " before " << in2 << '\n';
    else
        std::wcout << in2 << " before " << in1 << '\n';
 
    std::wcout << "In lexicographical comparison: ";
    if (in1 < in2)
        std::wcout << in1 << " before " << in2 << '\n';
    else
        std::wcout << in2 << " before " << in1 << '\n';
 
}

输出

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

[编辑] 参见

转换字符串,以便 strcmp 产生与 strcoll 相同的结果
(函数) [编辑]
[虚函数]
转换字符串,以便排序规则可以被比较替换
(std::collate<CharT> 的虚保护成员函数) [编辑]
根据当前语言环境比较两个宽字符串
(函数) [编辑]
C 文档 关于 wcsxfrm