C文字分類

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)で定義されています。

分類は有効なロケールに応じて評価されます。

バイト
文字
ワイド
文字
説明
isalnumiswalnumオペランドが英数字かどうかをチェックする
isalphaiswalphaオペランドがアルファベットかどうかをチェックする
isloweriswlowerオペランドが小文字かどうかをチェックします
isupperiswupperオペランドが大文字かどうかをチェックする
isdigitiswdigitオペランドが数字かどうかをチェックする
isxdigitiswxdigitオペランドが16進数かどうかをチェックする
iscntrliswcntrlオペランドが制御文字かどうかをチェックする
isgraphiswgraphオペランドがグラフィカル文字であるかどうかをチェックする
isspaceiswspaceオペランドがスペースかどうかをチェックする
isblankiswblankオペランドが空白文字であるかどうかをチェックします
isprintiswprintオペランドが印刷可能な文字であるかどうかをチェックします
ispunctiswpunctオペランドが句読点かどうかをチェックする
tolowertowlowerオペランドを小文字に変換します
touppertowupperオペランドを大文字に変換します
iswctypeオペランドが特定のクラスに該当するかどうかをチェックする
towctrans特定のマッピングを使用してオペランドを変換します
wctype使用されるワイド文字クラスを返しますiswctype
wctrans使用される変換マッピングを返しますtowctrans

参考文献

  1. ^ ISO/IEC 9899:1999 仕様(PDF)。p. 193、§ 7.4。

Retrieved from "https://en.wikipedia.org/w/index.php?title=C_character_classification&oldid=1252566960"