【概要】
isDigit() は、与えられた文字(char型)が算術的な数値(’0’から’9’)を表現する文字であるかどうかを判定する関数です。主にシリアル通信によるユーザー入力のバリデーション、コマンド解析、または文字列操作において、入力データが期待される数値形式であるかを確認するために使用されます。
この関数は内部的に、文字のASCIIコード(または対応する文字セットのコード)が、数字に対応する範囲内にあるかを評価します。
【仕様】
- 関数シグネチャ:
int isDigit(char c) - 引数:
c(char): 判定対象の単一文字。
- 戻り値:
int: 文字が数字(’0′-‘9’)であれば非ゼロ(真)、それ以外であれば 0(偽)を返します。
- データ型:
- 入力は
char型です。 - 戻り値は
int型ですが、論理値として評価されます。
- 入力は
- 初期状態:
- 状態を保持するものではなく、純粋な関数(Pure Function)として動作します。
【技術的特徴】
- ASCIIコードベースの判定:
isDigit()は、文字の内部表現がASCIIコードであることを前提としています。’0’(十進数 48)から ‘9’(十進数 57)までの範囲をチェックします。 - 計算量: 極めて低負荷です。基本的には比較演算子の組み合わせ、あるいはルックアップテーブルによる高速な判定が行われます。
- 標準ライブラリとの関係: Arduino環境においては、C言語標準ライブラリの
isdigit()に準拠した挙動をします。 - 比較:
isDigit(): 文字が「数字の文字」であるかを確認する。atoi()/toInt(): 文字列を「数値(整数)」に変換する。isDigit()は変換を行わず、単なる存在確認のみを行います。
【注意点】
- 数値との混同:
isDigit('5')は真を返しますが、これは「文字の’5’」を判定しているためです。数値の5をisDigit()に渡した場合、メモリ上の値(数値の5はASCIIで制御文字に相当する)を判定するため、意図しない結果を招く可能性があります。常に文字として扱ってください。 - 全角文字の扱い: この関数は標準的な半角英数字を対象としています。日本語環境の全角数字(例: ‘5’)は判定対象外となります。
- 符号の無視: 負の符号(’-‘)や小数点の(’.’)は数字とはみなされません。負の数や実数を入力として受け取る場合は、
isDigit()の前に符号の有無を個別に判定する必要があります。 - リソース制約: 極めて軽量ですが、大量の文字列を逐次走査する際のループ内での使用は、オーバーヘッドを最小限に抑えるためにも適した関数です。
【サンプルコード】
シリアル通信を通じて受信した文字が数字であるかを確認し、数字のみを抽出して表示する実装例です。
void setup() {
Serial.begin(9600);
Serial.println("Enter a number (or press any key to stop): ");
}
void loop() {
if (Serial.available() > 0) {
char incomingByte = Serial.read();
if (isDigit(incomingByte)) {
Serial.print("Valid Digit: ");
Serial.println(incomingByte);
} else {
Serial.print("Invalid Input: ");
Serial.println(incomingByte);
}
}
}
【活用例】
- コマンドパーサー: 「SET_TEMP:25」のような文字列を受け取った際、コロンの後の文字が正当な数値範囲内かチェックする。
- パスワードバリデーション: ユーザー入力が「数字のみ」で構成されているか、あるいは「英数字」が含まれているかを判定するフィルタ処理。
- センサーデータ受信の堅牢性: 外部モジュールから送られてくるバイナリ/テキスト混在データから、特定の数値フィールドを抽出する際のノイズ除去。


コメント