命名空间
变体
操作

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 比较两个转换后的字符串的结果与在当前 C 区域设置中使用 std::wcscoll 比较原始字符串的结果相同。

转换后的字符串的前 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