文字の判定

大文字と小文字の相互変換の項ではtolower関数、toupper関数、islower関数、isupper関数の説明をしました。
これらはctype.hをインクルードすることで使用できますが、ctype.hには他にも文字を処理するための関数が用意されています。
数はそれほど多くないので、ここで紹介します。

引数に指定できる値は全てunsigned char型の範囲(0~255)、またはEOF(-1)のみです。
それ以外の値を指定した場合の動作は未定義です。

また、戻り値はすべてint型です。

英数字の判定

isalpha関数は、文字が英字(アルファベット)ならば0以外を返します。
英字以外ならば0を返します。
isdigit関数は、文字が数字ならば0以外を返します。
数字以外ならば0を返します。
isalnum関数は、文字が英数字ならば0以外を返します。
英数字以外ならば0を返します。


#include <stdio.h>
#include <ctype.h>

int main()
{
    printf("isalpha\n");
    printf("%c : %d\n", 'A', isalpha('A'));
    printf("%c : %d\n", 'z', isalpha('z'));
    printf("%c : %d\n", '3', isalpha('3'));

    printf("\nisdigit\n");
    printf("%c : %d\n", 'A', isdigit('A'));
    printf("%c : %d\n", 'z', isdigit('z'));
    printf("%c : %d\n", '3', isdigit('3'));

    printf("\nisalnum\n");
    printf("%c : %d\n", 'A', isalnum('A'));
    printf("%c : %d\n", 'z', isalnum('z'));
    printf("%c : %d\n", '3', isalnum('3'));

    getchar();
}
isalpha
A : 1
z : 2
3 : 0

isdigit
A : 0
z : 0
3 : 4

isalnum
A : 1
z : 2
3 : 4

is〇〇系の関数は、引数がホニャララか否かを判定する関数です。
戻り値は真なら0以外、偽なら0を返すので、そのままif文等の条件式に使用することができます。

16進数文字の判定

isxdigit関数は、16進数に使用される文字ならば0以外を返します。
それ以外なら0を返します。
16進数文字とは0~9、a~f、A~Fのいずれかの文字のことです。


printf("%c : %d\n", 'A', isxdigit('A'));
printf("%c : %d\n", 'z', isxdigit('z'));
printf("%c : %d\n", '3', isxdigit('3'));
A : 128
z : 0
3 : 128

制御文字や印字文字の判定

「文字」というのは例えば「ABC」などの人間が読むためのもの以外にも、機械の処理に使用するためのものも含まれます。
これを制御文字と言います。
これに対して英数記号などは印字文字といいます。

isprint関数は文字が印字文字ならば0以外を返します。
iscntrl関数が文字が制御文字ならば0以外を返します。


printf("isprint\n");
printf("%c : %d\n", 10, isprint(10));
printf("%c : %d\n", 40, isprint(40));
printf("%c : %d\n", 80, isprint(80));

printf("\niscntrl\n");
printf("%c : %d\n", 10, iscntrl(10));
printf("%c : %d\n", 40, iscntrl(40));
printf("%c : %d\n", 80, iscntrl(80));
isprint
: 0
( : 16
P : 1

iscntrl
: 32
( : 0
P : 0

制御文字を文字で表すことはできないので数値指定しています。
(エスケープ文字には一部の制御文字がある)

これらの関数は、一方が真(0以外)ならもう一方は偽(0)となります。
半角スペースは人間が読むためのものなので印字文字ですが、改行(\n)やタブ文字(\t)は制御文字になります。
(英語は単語間にスペースがないと読むことができない)

isgraph関数は、印字文字から空白を除いた文字の場合に0以外を返します。
これを図形文字といいます。


printf("isprint\n");
printf("%c : %d\n", 'A', isprint('A'));
printf("%c : %d\n", ' ', isprint(' '));

printf("\nisgraph\n");
printf("%c : %d\n", 'A', isgraph('A'));
printf("%c : %d\n", ' ', isgraph(' '));
isprint
A : 1
  : 64

isgraph
A : 1
  : 0

空白文字、区切り文字の判定

空白文字とは、半角スペースのほか、水平タブ(\t)、垂直タブ(\v)、改行(\n)、復帰(\r)、書式送り(\f)のことを言います。
区切り文字とは、図形文字のうち英数字以外のもの、つまり記号のことを言います。

isspace関数は、空白文字の場合に0以外を返します。
isblank関数は、半角スペースまたはタブ文字の場合に0以外を返します。
ispunct関数は、区切り文字の場合に0以外を返します。


printf("isspace\n");
printf("%c : %d\n", 'A', isspace('A'));
printf("%c : %d\n", '@', isspace('@'));
printf("%c : %d\n", '\r', isspace('\r'));
printf("%c : %d\n", ' ', isspace(' '));

printf("\nisblank\n");
printf("%c : %d\n", 'A', isblank('A'));
printf("%c : %d\n", '@', isblank('@'));
printf("%c : %d\n", '\r', isblank('\r'));
printf("%c : %d\n", ' ', isblank(' '));

printf("\niispunct\n");
printf("%c : %d\n", 'A', ispunct('A'));
printf("%c : %d\n", '@', ispunct('@'));
printf("%c : %d\n", '\r', ispunct('\r'));
printf("%c : %d\n", ' ', ispunct(' '));
isspace
A : 0
@ : 0
 : 8
  : 8

isblank
A : 0
@ : 0
 : 0
  : 64

ispunct
A : 0
@ : 16
 : 0
  : 0