std::strxfrm
From cppreference.com
| ヘッダー <cstring> で定義 |
||
| std::size_t strxfrm( char* dest, const char* src, std::size_t count ); |
||
現在のCロケールにおいて、srcが指すヌル終端バイト文字列を、実装定義の形式に変換します。この変換により、2つの変換後文字列をstd::strcmpで比較した結果が、元の文字列をstd::strcollで比較した結果と同じになります。
変換された文字列の最初の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
[編集] 関連項目
wcscmpがwcscollと同じ結果を生成するようにワイド文字列を変換する(関数) | |
| [virtual] |
照合を比較に置き換えることができるように文字列を変換します。 ( std::collate<CharT> の仮想保護メンバ関数) |
| 現在のロケールに従って2つの文字列を比較する (関数) | |
| C ドキュメント strxfrm
| |