Namespaces
Variants

std:: strxfrm

From cppreference.net
定义于头文件 <cstring>
std:: size_t strxfrm ( char * dest, const char * src, std:: size_t count ) ;

src 所指向的空终止字节字符串转换为实现定义的形式,使得用 std::strcmp 比较两个转换后的字符串,与在当前 C 语言区域设置下用 std::strcoll 比较原始字符串的结果相同。

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

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

如果 count 0 ,则允许 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 相同的结果
(函数)
[virtual]
转换字符串以便用比较替代排序
( std::collate<CharT> 的虚受保护成员函数)
根据当前区域设置比较两个字符串
(函数)
C 文档 关于 strxfrm