Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
isalpha() / isdigit() / isspace() / isalnum()
文字が英字・数字・空白などの種類に属するかどうかを判定する関数群です。『<ctype.h>』に定義されており、文字列のバリデーションや字句解析によく使われます。
構文
// いずれも引数に unsigned char の値(または EOF)を渡します。 // 戻り値: 条件を満たせば非0(真)、満たさなければ 0(偽)。 int isalpha(int c); // 英字(a-z, A-Z)か判定します。 int isdigit(int c); // 10進数字(0-9)か判定します。 int isalnum(int c); // 英字または数字か判定します。 int isspace(int c); // 空白文字(スペース・タブ・改行など)か判定します。 int isupper(int c); // 大文字(A-Z)か判定します。 int islower(int c); // 小文字(a-z)か判定します。 int ispunct(int c); // 記号・句読点か判定します。 int isprint(int c); // 印刷可能文字(スペース含む)か判定します。 int iscntrl(int c); // 制御文字か判定します。
主な判定関数一覧
| 関数 | 対象文字 | 概要 |
|---|---|---|
| isalpha() | a-z, A-Z | 英字かどうかを判定します。ロケール依存の文字(アクセント付きなど)を含む場合があります。 |
| isdigit() | 0-9 | ASCII の 10進数字かどうかを判定します。ロケールに依存しません。 |
| isalnum() | a-z, A-Z, 0-9 | isalpha() または isdigit() が真であれば真を返します。 |
| isspace() | ' ', '\t', '\n', '\r', '\f', '\v' | 空白類文字かどうかを判定します。 |
| isupper() | A-Z | 大文字かどうかを判定します。 |
| islower() | a-z | 小文字かどうかを判定します。 |
| ispunct() | !@#… など | 印刷可能でありスペースでも英数字でもない文字かどうかを判定します。 |
サンプルコード
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int main(void) {
const char *str = "Hello, World! 123";
int alpha = 0, digit = 0, space = 0, punct = 0;
// 文字列の各文字を分類してカウントします。
for (int i = 0; str[i] != '\0'; i++) {
unsigned char c = (unsigned char)str[i]; // キャストして安全に渡します。
if (isalpha(c)) alpha++;
else if (isdigit(c)) digit++;
else if (isspace(c)) space++;
else if (ispunct(c)) punct++;
}
printf("英字: %d, 数字: %d, 空白: %d, 記号: %d\n",
alpha, digit, space, punct);
// 『英字: 10, 数字: 3, 空白: 3, 記号: 2』と出力されます。
// 識別子(英字またはアンダースコアで始まり英数字かアンダースコアが続く)のバリデーションです。
const char *id = "my_var_1";
int valid = isalpha((unsigned char)id[0]) || id[0] == '_';
for (size_t i = 1; i < strlen(id) && valid; i++) {
valid = isalnum((unsigned char)id[i]) || id[i] == '_';
}
printf("'%s' は%s識別子です。\n", id, valid ? "有効な" : "無効な");
// 『my_var_1 は有効な識別子です。』と出力されます。
return 0;
}
概要
引数に char 型の値をそのまま渡すと、負の値(符号付き char の場合)を渡したとき未定義動作が発生します。必ず『(unsigned char)c』にキャストしてから渡してください。
これらの関数はロケール(地域設定)の影響を受ける場合があります。特に isalpha() はロケールによって ASCII 範囲外の文字を英字と判定することがあります。ASCII 文字のみを対象にするならロケール依存は問題になりません。
文字の大文字・小文字変換には『tolower() / toupper()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。