Namespaces
Variants

std:: strxfrm

From cppreference.net
ヘッダーで定義 <cstring>
std:: size_t strxfrm ( char * dest, const char * src, std:: size_t count ) ;

ヌル終端バイト文字列を指す src を、現在のCロケールにおいて、変換後の2つの文字列を std::strcmp で比較した結果が、元の文字列を std::strcoll で比較した結果と同じになる、実装定義の形式に変換します。

変換された文字列の最初の count 文字が終端のnull文字を含めて宛先に書き込まれ、完全な変換された文字列の長さが終端のnull文字を除いて返されます。

dest 配列が十分な大きさでない場合、動作は未定義です。 dest src がオーバーラップする場合、動作は未定義です。

count 0 の場合、 dest はヌルポインタでも許可されます。

目次

注記

変換された文字列全体を受け取ることができる正しいバッファの長さは 1 + std :: strxfrm ( nullptr, src, 0 ) です。

この関数は、同じ文字列または文字列のセットを使用して複数のロケール依存の比較を行う場合に使用されます。なぜなら、すべての文字列を一度だけ変換するために std::strxfrm を使用し、その後変換された文字列を std::strcmp で比較する方が効率的であるためです。

パラメータ

dest - 変換後の文字列が書き込まれる配列の最初の要素へのポインタ
src - 変換対象のヌル終端バイト文字列の最初の文字へのポインタ
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 と同じ結果を生成するようにする
(関数)
[virtual]
照合を比較で置き換えられるように文字列を変換する
( std::collate<CharT> の仮想保護メンバ関数)
現在のロケールに従って2つの文字列を比較する
(関数)