命名空间
变体
操作

std::strxfrm

来自 cppreference.cn
< cpp‎ | string‎ | byte
在头文件 <cstring> 中定义
std::size_t strxfrm( char* dest, const char* src, std::size_t count );

src 指向的以 null 结尾的字节字符串转换为实现定义的形式,使得使用 std::strcmp 比较两个转换后的字符串的结果与在当前 C 语言环境中,使用 std::strcoll 比较原始字符串的结果相同。

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

如果 dest 数组不够大,则行为未定义。如果 destsrc 重叠,则行为未定义。

如果 count0,则 dest 可以是空指针。

目录

[编辑] 注意

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

当使用相同字符串或字符串集进行多次与语言环境相关的比较时,会使用此函数,因为使用 std::strxfrm 一次性转换所有字符串,然后使用 std::strcmp 比较转换后的字符串会更高效。

[编辑] 参数

dest - 指向将写入转换后字符串的数组的第一个元素的指针
src - 指向要转换的以 null 结尾的字节字符串的第一个字符的指针
count - 要写入的最大字符数

[编辑] 返回值

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

[编辑] 示例

#include <cassert>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <string>
 
int main()
{
    char* loc = std::setlocale(LC_COLLATE, "cs_CZ.iso88592");
    assert(loc);
 
    std::string in1 = "hrnec";
    std::string out1(1 + std::strxfrm(nullptr, in1.c_str(), 0), ' ');
    std::string in2 = "chrt";
    std::string out2(1 + std::strxfrm(nullptr, in2.c_str(), 0), ' ');
 
    std::strxfrm(&out1[0], in1.c_str(), out1.size());
    std::strxfrm(&out2[0], in2.c_str(), out2.size());
 
    std::cout << "In the Czech locale: ";
    if (out1 < out2)
        std::cout << in1 << " before " << in2 << '\n';
    else
        std::cout << in2 << " before " << in1 << '\n';
 
    std::cout << "In lexicographical comparison: ";
    if (in1 < in2)
        std::cout << in1 << " before " << in2 << '\n';
    else
        std::cout << in2 << " before " << in1 << '\n';
}

可能的输出

In the Czech locale: hrnec before chrt
In lexicographical comparison: chrt before hrnec

[编辑] 另请参阅

转换宽字符串,使 wcscmp 产生与 wcscoll 相同的结果
(函数) [编辑]
[虚函数]
转换字符串,以便整理可以通过比较来替代
(std::collate<CharT> 的虚保护成员函数) [编辑]
根据当前区域设置比较两个字符串
(函数) [编辑]
C 文档 关于 strxfrm