C 文字分類は、 C 標準ライブラリ内の一連の操作であり、文字がアルファベット、制御文字などの特定の文字クラスに属しているかどうかをテストします。シングルバイト文字とワイド文字の両方がサポートされています。[1]
歴史
Unixオペレーティング システムで作業していた初期のC プログラマーは、文字を分類するためのプログラミング イディオムを開発しました。たとえば、次のコードはASCII文字に対してtrueと評価されます。
c
( 'A' <= c && c <= 'Z' ) || ( 'a' <= c && c <= 'z' )
最終的に、一般的な文字分類機能へのインターフェースは、C 標準ライブラリ ファイルctype.hにコード化されました。
実装
パフォーマンス上の理由から、標準の文字分類関数は通常、関数ではなくマクロとして実装されます。ただし、マクロ評価の制限により、次のようなLinuxの初期バージョンのように、現在では一般的には実装されていません。
#define isdigit(c) ((c) >= '0' && (c) <= '9')
マクロパラメータが副作用xを持つ式に展開されると、エラーが発生する可能性があります。例: 。実装が関数の場合、 x は 1 回だけ増分されます。ただし、このマクロ定義では 2 回増分されます。
isdigit(x++)
この問題を解消するために、マクロでテーブル参照を使用するのが一般的な実装です。たとえば、標準ライブラリは、文字値ごとに 1 つずつ、合計 256 個の整数の配列を提供します。この配列には、サポートされている分類ごとにビット フィールドが含まれています。マクロは、文字値のインデックスで整数を参照し、関連付けられたビット フィールドにアクセスします。たとえば、下位ビットが文字が数字かどうかを示す場合、isdigitマクロは次のように記述できます。
#define isdigit(c) (TABLE[c] & 1)
マクロ引数はc1 回だけ参照されるため、 は 1 回だけ評価されます。
機能の概要
シングルバイト文字を操作する関数は、ctype.hヘッダー ファイル ( C++ ではcctype ) で定義されています。ワイド文字を操作する関数は、wctype.hヘッダー ファイル ( C++ ではcwctype ) で定義されています。
分類は有効なロケールに応じて評価されます。
参考文献
- ^ ISO/IEC 9899:1999 仕様(PDF)。p. 193、§ 7.4。
外部リンク
