std:: strxfrm
|
Определено в заголовочном файле
<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>
)
|
|
сравнивает две строки в соответствии с текущей локалью
(функция) |
|
|
Документация C
для
strxfrm
|
|