Namespaces
Variants

wcsxfrm

ja.cppreference.net より
 
 
 
 
ヘッダで定義 <wchar.h>
size_t wcsxfrm( wchar_t* dest, const wchar_t* src, size_t count );
(C95以降)
(C99まで)
size_t wcsxfrm( wchar_t* restrict dest, const wchar_t* restrict src, size_t count );
(C99以降)

srcが指すナル終端ワイド文字列を、実装定義の形式に変換します。これにより、変換された2つの文字列をwcscmpで比較した結果が、現在のCロケールにおいて元の文字列をwcscollで比較した結果と同じになります。

変換された文字列の最初のcount文字(終端ナル文字を含む)がdestinationに書き込まれ、終端ナル文字を除いた完全な変換文字列の長さが返されます。

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

ノート

完全な変換文字列を受け取るためのバッファの正しい長さは1 + wcsxfrm(NULL, src, 0)

この関数は、同じワイド文字列または一連のワイド文字列を使用して複数のロケール依存の比較を行う場合に使用されます。なぜなら、wcsxfrmを使用してすべての文字列を一度だけ変換し、その後変換されたワイド文字列をwcscmpで比較する方が効率的だからです。

引数

dest - 変換された文字列を書き込むためのワイドナル終端文字列の最初の要素へのポインタ
src - 変換するナル終端ワイド文字列へのポインタ
count - 出力する最大文字数

戻り値

変換されたワイド文字列の長さ(終端ナル文字を含まない)

例

#include <locale.h>
#include <stdio.h>
#include <wchar.h>

int main(void)
{
    setlocale(LC_ALL, "sv_SE.utf8");

    const wchar_t* in1 = L"\u00e5r";
    wchar_t out1[1 + wcsxfrm(NULL, in1, 0)];
    wcsxfrm(out1, in1, sizeof out1/sizeof *out1);

    const wchar_t* in2 = L"\u00e4ngel";
    wchar_t out2[1 + wcsxfrm(NULL, in2, 0)];
    wcsxfrm(out2, in2, sizeof out2 / sizeof *out2);

    printf("In the Swedish locale: ");
    if (wcscmp(out1, out2) < 0)
        printf("%ls before %ls\n", in1, in2);
    else
        printf("%ls before %ls\n", in2, in1);

    printf("In lexicographical comparison: ");
    if (wcscmp(in1, in2) < 0)
        printf("%ls before %ls\n", in1, in2);
    else
        printf("%ls before %ls\n", in2, in1);
}

出力:

In the Swedish locale: år before ängel
In lexicographical comparison: ängel before år

参考文献

  • C23標準 (ISO/IEC 9899:2024):
  • 7.29.4.4.4 wcsxfrm関数 (p: TBD)
  • C17標準 (ISO/IEC 9899:2018):
  • 7.29.4.4.4 wcsxfrm関数 (p: TBD)
  • C11標準 (ISO/IEC 9899:2011):
  • 7.29.4.4.4 wcsxfrm関数 (p: 434-435)
  • C99標準 (ISO/IEC 9899:1999):
  • 7.29.4.4.4 wcsxfrm関数 (p: 380-381)

関連項目

現在のロケールに従って2つの文字列を比較する
(関数)
現在のロケールに従って2つのワイド文字列を比較する
(関数)
(C95)
2つのワイド文字列を比較する
(関数)
strcmp が strcoll と同じ結果を生成するように文字列を変換する
(関数)