std::strxfrm
提供: cppreference.com
ヘッダ <cstring> で定義 | ||
std::size_t strxfrm(char* dest, constchar* src, std::size_t count ); | ||
現在の C のロケールにおいて、 std::strcoll で2つの文字列を比較したのと同じ結果を std::strcmp で変換後の2つの文字列を比較することで得られるように、 src
の指すヌル終端バイト文字列を処理系定義の形式に変換します。
変換後の文字列の最初の count
個の文字 (終端のヌル文字を含む) が dest
に書き込まれ、完全な変換後の文字列の長さ (終端のヌル文字を除く) が返されます。
dest
配列が十分大きくない場合、動作は未定義です。 dest
と src
がオーバーラップしている場合、動作は未定義です。
count
が 0 の場合、 dest
はヌルポインタでも構いません。
目次 |
[編集]ノート
変換後の文字列全体を受け取れるバッファの正しい長さは 1+std::strxfrm(nullptr, src, 0) です。
この関数は同じ文字列または文字列の集合を使用してロケール依存の比較を複数回行うときに使用されます。 std::strxfrm を使用してすべての文字列を一度だけ変換し、その後 std::strcmp を使用して変換後の文字列を比較すると効率的です。
[編集]引数
dest | - | 変換後の文字列を書き込む配列の最初の要素を指すポインタ |
src | - | 変換するヌル終端バイト文字列の最初の文字を指すポインタ |
count | - | 書き込む最大文字数 |
[編集]戻り値
終端のヌル文字を含まない変換後の文字列の長さ。
[編集]例
Run this code
#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';elsestd::cout<< in2 <<" before "<< in1 <<'\n'; std::cout<<"In lexicographical comparison: ";if(in1 < in2)std::cout<< in1 <<" before "<< in2 <<'\n';elsestd::cout<< in2 <<" before "<< in1 <<'\n'; }
出力:
In the Czech locale: hrnec before chrt In lexicographical comparison: chrt before hrnec
[編集]関連項目
wcscoll と同じ結果を wcscmp で得られるようにワイド文字列を変換します (関数) | |
[仮想] | 照合を比較に置き換えられるように文字列を変換します ( std::collate<CharT> の仮想プロテクテッドメンバ関数) |
現在のロケールに従って2つの文字列を比較します (関数) | |
strxfrm の C言語リファレンス |