命名空间
变体
操作

std::strxfrm

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

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

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

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

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

内容

[编辑] 备注

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

当使用相同字符串或一组字符串进行多个依赖于本地化的比较时,此函数很有用,因为使用 std::strxfrm 只转换一次所有字符串,然后使用 std::strcmp 比较转换后的字符串,效率更高。

[编辑] 参数

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

[编辑] 返回值

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

[编辑] 示例

#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 文档 for strxfrm