知識ベース

C文字の分類

C文字分類は、Cプログラミング言語用のANSI C標準ライブラリの関数グループによって提供される操作です。これらの関数は、アルファベット文字、制御文字など、特定のクラスの文字のメンバーシップについて文字をテストするために使用されます。シングルバイト文字とワイド文字の両方がサポートされています。

歴史

UnixでCを書く初期のツールスミスは、文字をさまざまなタイプに分類するためのイディオムを急速に開発し始めました。たとえば、ASCII文字セットでは、次のテストは文字を識別します。

if(( 'A' = c && c = 'Z')||( 'a' = c && c = 'z'))

しかし、このイディオムは必ずしも EBCDICなどの他の文字セットでは動作しません

すぐに、上記のようなテスト、またはさらに悪いことに、上記のようなテストでプログラムが厚くなった。プログラマは、同じイディオムをいくつかの異なる方法で記述できます。これにより、理解が遅くなり、エラーが発生する可能性が高くなります。

やがて、イディオムはctype.h>の関数に置き換えられました。

実装

上記の例とは異なり、文字分類ルーチンは比較テストとして作成されていません。ほとんどのCライブラリでは、マクロや関数ではなく、静的なテーブルルックアップとして記述されています。

たとえば、ビットフィールドとして配置された256個の8ビット整数の配列が作成されます。各ビットは、文字の特定のプロパティ(isdigit、isalphaなど)に対応します。整数の最下位ビットがisdigitプロパティに対応する場合、コードは次のように記述できます。

#define isdigit(x)(TABLE&1)

Linuxの初期バージョンでは、最初のコードサンプルと同様の潜在的に障害のある方法を使用していました。

#define isdigit(x)((x)> = '0' &&(x)= '9')

これは、xに副作用がある場合、たとえばisdigit(x ++)またはisdigit(run_some_program())を呼び出す場合に問題を引き起こす可能性があります。 isdigitの引数が2回評価されていることはすぐにはわかりません。このため、一般的にテーブルベースのアプローチが使用されます。

これらの2つの方法の違いは、SCO v。IBMのケースで興味深い点になりました。

機能の概要

シングルバイト文字を操作する関数は、ctype.hヘッダー(C ++のcctypeヘッダー)で定義されています。ワイド文字を操作する関数は、wctype.hヘッダー(C ++のcwctypeヘッダー)で定義されています。

分類は、現在のロケールに従って行われます。

バイト
キャラクター
ワイド
キャラクター
説明
isalnum イスワルナム byte / wchar_tが英数字かどうかを確認します
isalpha iswalpha byte / wchar_tがアルファベットかどうかを確認します
低い圧倒的 byte / wchar_tが小文字かどうかを確認します
isupper iswupper byte / wchar_tが大文字のbyte / wchar_tであるかどうかを確認します
isdigit iswdigit byte / wchar_tが数字かどうかを確認します
isxdigit iswxdigit byte / wchar_tが16進数byte / wchar_tかどうかを確認します
iscntrl iswcntrl byte / wchar_tが制御byte / wchar_tであるかどうかを確認します
イスグラフ iswgraph byte / wchar_tがグラフィカルバイト/ wchar_tかどうかを確認します
isspace iswspace byte / wchar_tがスペースbyte / wchar_tであるかどうかを確認します
空白 iswblank byte / wchar_tが空白のbyte / wchar_tであるかどうかを確認します(C99 / C ++ 11)
isprint iswprint byte / wchar_tが印刷byte / wchar_tかどうかを確認します
ispunct iswpunct byte / wchar_tが句読点byte / wchar_tであるかどうかを確認します
低いけん引 byte / wchar_tを小文字に変換します
タッパーけん引 byte / wchar_tを大文字に変換します
なし iswctype wchar_tが特定のクラスに該当するかどうかを確認します
なし towctrans 特定のマッピングを使用してwchar_tを変換します
なし wctype iswctypeで使用されるワイド文字クラスを返します
なし wctrans towctransで使用される変換マッピングを返します