C文字分類
| C standard library (libc) |
|---|
| General topics |
| Miscellaneous headers |
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++)
この問題を解消するための一般的な実装は、マクロでテーブル参照を使用することです。例えば、標準ライブラリは256個の整数(文字値ごとに1つ)の配列を提供しており、各整数にはサポートされている分類ごとにビットフィールドが含まれています。マクロは文字値のインデックスで整数を参照し、関連するビットフィールドにアクセスします。例えば、最下位ビットが文字が数字かどうかを示す場合、isdigitマクロは次のように記述できます。
#define isdigit(c) (TABLE[c] & 1)マクロ引数cは 1 回だけ参照されるため、 は 1 回だけ評価されます。
機能の概要
シングルバイト文字を操作する関数はctype.hヘッダーファイル( C++ではcctype)で定義されています。ワイド文字を操作する関数はwctype.hヘッダーファイル( C++ではcwctype)で定義されています。
分類は有効なロケールに応じて評価されます。
| バイト 文字 | ワイド 文字 | 説明 |
|---|---|---|
isalnum | iswalnum | オペランドが英数字かどうかをチェックする |
isalpha | iswalpha | オペランドがアルファベットかどうかをチェックする |
islower | iswlower | オペランドが小文字かどうかをチェックします |
isupper | iswupper | オペランドが大文字かどうかをチェックする |
isdigit | iswdigit | オペランドが数字かどうかをチェックする |
isxdigit | iswxdigit | オペランドが16進数かどうかをチェックする |
iscntrl | iswcntrl | オペランドが制御文字かどうかをチェックする |
isgraph | iswgraph | オペランドがグラフィカル文字であるかどうかをチェックする |
isspace | iswspace | オペランドがスペースかどうかをチェックする |
isblank | iswblank | オペランドが空白文字であるかどうかをチェックします |
isprint | iswprint | オペランドが印刷可能な文字であるかどうかをチェックします |
ispunct | iswpunct | オペランドが句読点かどうかをチェックする |
tolower | towlower | オペランドを小文字に変換します |
toupper | towupper | オペランドを大文字に変換します |
| — | iswctype | オペランドが特定のクラスに該当するかどうかをチェックする |
| — | towctrans | 特定のマッピングを使用してオペランドを変換します |
| — | wctype | 使用されるワイド文字クラスを返しますiswctype |
| — | wctrans | 使用される変換マッピングを返しますtowctrans |
参考文献
- ^ ISO/IEC 9899:1999 仕様(PDF)。p. 193、§ 7.4。