std::strxfrm
Определён в заголовочном файле <cstring> | ||
|---|---|---|
std::size_t strxfrm( char* dest, const char* src, std::size_t count ); |
Преобразует нуль-терминированную байтовую строку, на которую указывает src, в форму, определяемую реализацией, так что сравнение двух преобразованных строк с помощью std::strcmp даёт тот же результат, что и сравнение исходных строк с помощью std::strcoll в текущей локали C.
Первые 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 (функция) |
|
|
[виртуальная] | преобразует строку, чтобы сравнение могло заменить сортировку (виртуальная защищённая функция-член класса std::collate<CharT>) |
| сравнивает две строки в соответствии с текущей локалью (функция) |
|
Документация C для strxfrm |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/string/byte/strxfrm