【概要】
isgraph() は、与えられた文字が「グラフィック文字(印刷可能な文字であり、かつ空白ではない文字)」であるかどうかを判定する関数です。標準的なC言語の <ctype.h> ライブラリに準拠しており、Arduino環境のGCCコンパイラにおいても標準的に利用可能です。この関数は、文字の視覚的な表現の有無を判定するために使用されます。
【仕様】
- 引数:
int c
判定対象の文字。通常、char型の変数を渡しますが、内部的にはint型として処理されます。 - 戻り値:
- 真 (Non-zero): 対象がグラフィック文字である場合。
- 偽 (Zero): 対象が空白文字(スペース、タブ、改行等)または印刷不可能な制御文字である場合。
- データ型:
int - 初期状態: 特になし(純粋な関数)。
【技術的特徴】
- isprint() との差異:
isprint()はスペース(’ ‘)を含むすべての印刷可能文字を判定しますが、isgraph()はスペースを除外します。このため、UIの描画処理において「空白を除いた内容のみを処理したい」場合に適しています。 - アルゴリズム:
多くの環境では、ルックアップテーブル(Lookup Table)を参照する実装となっており、計算量は O(1) であり、組み込みシステムにおいて極めて高速に動作します。 - ハードウェアレベルの挙動:
この関数は、文字コード(ASCII等)の特定の範囲をチェックします。演算はCPUのレジスタ内で完結するため、追加のメモリ確保や複雑な分岐を必要としません。
【注意点】
- 符号付き文字のキャスト:
char型が負の値をとる環境(拡張ASCIIなど)では、isgraph()が予期しない動作をする可能性があります。安全性を確保するため、以下のようにunsigned charへキャストして渡すことが推奨されます。
isgraph((unsigned char)c) - マルチバイト文字 (UTF-8) への非対応:
Arduino環境で一般的に利用されるUTF-8エンコーディングにおいて、日本語などのマルチバイト文字は正しく判定されません。この関数は単一バイト(Single-byte)の文字判定を前提としています。 - ロケール依存:
動作はシステムのロケール設定に依存しますが、Arduinoの標準的な環境では基本的にASCII/ISO-8859範囲に基づいた挙動となります。
【サンプルコード】
#include <Arduino.h>
void setup() {
Serial.begin(9600);
// スペース、タブ、改行を含む文字列
String input = "Arduino_Dev 101\t\n\r";
Serial.print("Original: ");
Serial.println(input);
Serial.print("Graph only: ");
for (int i = 0; i < input.length(); i++) {
char c = input[i];
// 印刷可能なグラフィック文字のみを出力
if (isgraph(c)) {
Serial.print(c);
}
}
Serial.println();
}
void loop() {}
【活用例】
- LCD/OLEDディスプレイのUI制御: 文字列を画面に描画する前に、不要なスペースや制御文字を除去して表示領域を最適化する。
- シリアルコマンドのバリデーション: ユーザー入力からスペースを除去してコマンドを解析する、あるいは入力データが正しい文字範囲内にあるかを確認する前処理。
- ログデータのクレンジング: センサーデータに混入した可能性のある制御文字を特定し、ログ出力から除外する処理。


コメント