命名空间
变体
操作

std::wcsxfrm

来自 cppreference.com
< 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