名前空間
変種
操作

std::strxfrm

提供: cppreference.com
< cpp‎ | string‎ | byte
ヘッダ <cstring> で定義
std::size_t strxfrm( char* dest, const char* src, std::size_t count );

現在の C のロケールにおいて、 std::strcoll で2つの文字列を比較したのと同じ結果を std::strcmp で変換後の2つの文字列を比較することで得られるように、 src の指すヌル終端バイト文字列を処理系定義の形式に変換します。

変換後の文字列の最初の count 個の文字 (終端のヌル文字を含む) が dest に書き込まれ、完全な変換後の文字列の長さ (終端のヌル文字を除く) が返されます。

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

count0 の場合、 dest はヌルポインタでも構いません。

目次

[編集] ノート

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

この関数は同じ文字列または文字列の集合を使用してロケール依存の比較を複数回行うときに使用されます。 std::strxfrm を使用してすべての文字列を一度だけ変換し、その後 std::strcmp を使用して変換後の文字列を比較すると効率的です。

[編集] 引数

dest - 変換後の文字列を書き込む配列の最初の要素を指すポインタ
src - 変換するヌル終端バイト文字列の最初の文字を指すポインタ
count - 書き込む最大文字数

[編集] 戻り値

終端のヌル文字を含まない変換後の文字列の長さ。

[編集]

#include <iostream>
#include <iomanip>
#include <cstring>
#include <string>
#include <cassert>
 
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

[編集] 関連項目

wcscoll と同じ結果を wcscmp で得られるようにワイド文字列を変換します
(関数) [edit]
照合を比較に置き換えられるように文字列を変換します
(std::collate<CharT>の仮想プロテクテッドメンバ関数) [edit]
現在のロケールに従って2つの文字列を比較します
(関数) [edit]