Namespaces
Variants

std:: strxfrm

From cppreference.net
Определено в заголовочном файле <cstring>
std:: size_t strxfrm ( char * dest, const char * src, std:: size_t count ) ;

Преобразует строку байтов, завершающуюся нулевым символом, на которую указывает src , в форму, определяемую реализацией, таким образом, что сравнение двух преобразованных строк с помощью std::strcmp дает тот же результат, что и сравнение исходных строк с помощью std::strcoll в текущей локали C.

Первые count символов преобразованной строки записываются в destination, включая завершающий нулевой символ, и возвращается длина полной преобразованной строки, исключая завершающий нулевой символ.

Поведение не определено, если массив 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> )
сравнивает две строки в соответствии с текущей локалью
(функция)