Spec-Zone.ru › C++

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

См. также

wcsxfrm
преобразовать широкую строку таким образом, чтобы wcscmp дало тот же результат, что и wcscoll
(функция)
do_transform
[virtual]
преобразует строку так, чтобы сортировка могла быть заменена сравнением
(виртуальная защищённая функция-член std::collate<CharT>)
strcoll
сравнивает две строки в соответствии с текущей локалью
(функция)
Документация C для strxfrm

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/string/byte/strxfrm

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API