strxfrm | Programming Place Plus C言語編 標準ライブラリのリファレンス

トップページC言語編標準ライブラリのリファレンス(名前順)

トップページC言語編標準ライブラリのリファレンス(ヘッダ別)


strxfrm関数

概要

ロケール特有の基準に沿った文字列比較を効率化するため、文字列を変換する

ヘッダ

string.h

形式

size_t strxfrm(char* restrict s1, const char* restrict s2, size_t n);

引数

s1

変換結果を受け取る配列を指すポインタ。n が 0 の場合に限って、ヌルポインタでも良い。

s2

変換元の文字列。

n

s1 が指す配列へ格納する最大文字数。末尾のヌル文字を含める。

戻り値

変換した結果の文字数。末尾のヌル文字を含まない。

詳細

文字列の内容を、ロケール特有の基準による比較を効率よく行えるような形に変換する。つまり、strcoll関数を使って比較を行うよりも、strcmp関数を使って比較を行う方が効率が良くなる(であろう)形に変換する。比較したい文字列が2つあるとして、その2つを strcoll関数で比較したときの結果と、strxfrm関数で変換した後の2つを strcmp関数で比較したときの結果とが一致するように変換される。
引数 n の値を超える文字数の文字を、引数 s1 へ書き込むことはない。引数 n の値は、終端のヌル文字を含む。
戻り値が、引数 n の値以上である場合、引数 s1 が指す配列の内容は不定である。
戻り値は、s1 が指す配列へ格納された文字数ではなく、変換結果の文字数である。そのため、引数 n に 0 を指定して「size = strxfrm(NULL, s, 0) + 1;」のようにすれば、変換結果を格納するために必要な配列の大きさを調べることができる(最後の +1 は、末尾のヌル文字の分である)。

注意

s1 と s2 が指す文字列のうち、処理に関係がある部分が重なり合っていた場合は未定義の動作になる。

使用例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>

int main(void)
{
    // LC_COLLATE をネイティブロケールに変更
    if (setlocale(LC_COLLATE, "") == NULL) {
        fputs("ロケールの設定に失敗しました。\n", stderr);
        return EXIT_FAILURE;
    }

    const char src[] = "xyz";
    char dest[16];

    // 以下は同じ結果を出力する
#if 1
    strxfrm(dest, src, sizeof(src));
    printf("%d\n", strcmp(src, "xy"));
    printf("%d\n", strcmp(src, "xyz"));
    printf("%d\n", strcmp(src, "xyzz"));
#else
    printf("%d\n", strcoll(src, "xy"));
    printf("%d\n", strcoll(src, "xyz"));
    printf("%d\n", strcoll(src, "xyzz"));
#endif
}

実行結果

1
0
-1

関連

ワイド文字列版の wcsxfrm関数がある。
ロケールの影響を受けない文字列比較は strcmp関数で、ロケールを考慮した文字列比較は strcoll関数で行える。

解説章


参考リンク


更新履歴

’2018/4/27 新規作成。



標準ライブラリのリファレンス(名前順)のトップページへ

標準ライブラリのリファレンス(ヘッダ別)のトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る