std::strxfrm
来自 cppreference.cn
在头文件 <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 数组不够大,则行为未定义。如果 dest 和 src 重叠,则行为未定义。
如果 count 为 0,则 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
|