パソコン活用研究シリコンバレー(C、C++、の活用研究)


文字検査・変換関数

Cの標準関数として、文字検査・変換関数がたくさん用意されています。

【文字検査・変換関数】
関数 仕様 使用例
isalmun

int isalmun(c);
int c;

cが英数字('a'-'z' 'A'-'Z' '0'-'9')なら真(0以外)そうでなければ偽(0)を返す

isalpha

int isalpha(c);
int c;

cがアルファベットなら真を返す
使用例はisalphaの使用例を参照

isascii int isascii(c);
int c;

cがアスキー文字(0x00 -- 0x7f)なら真
を返す。

int c;
if(isascii(c)) {printf("アスキー文字");}
iscntrl int iscntrl(c);
int c;

cがコントロールコード(制御文字)(0x00--0x1f, 0x7f)なら真を返す
isdigit int isdigit(c);
int c;

cが10進数値文字'0'--'9'なら真を返す。
使用例はisdigitの使用例を参照
islower int islower(c);
int c;

cが英小文字'a'--'z'なら真を返す
使用例は下にあります。
isprint int isprint(c);
int c;

cが表示可能文字(0x20--0x7e)なら真を返す
ispunct int ispunct(c);
int c;

cが句読点文字なら真を返す
isspace int isspace(c);
int c;

cが空白文字(0x09--0x0d, 0x20)なら真を返す
isupper int isupper(c);
int c;

cが英大文字('A'--'Z')なら真を返す。
isxdigit int isxdigit(c);
int c;

cが16進数値文字(0-9, 'a'-'f', 'A'-'F')なら真を返す。
toascii int toascii(c);
int c;

cをascii文字に変換する
tolower int tolower(c);
int c;

cを英大文字であれば小文字に変換する
int c;
c=getchar();
putchar(tolower(c));
toupper int toupper(c);
int c;

cが英小文字であれば、大文字に変換する

*ちなみに、LSIC86では、上記の関数の引数はint型ではなくchar型となっています。例えば、tolower(char c)
コンパイラによって多少仕様が異なったりすることもあるかもしれないので、お使いのコンパイラのマニュアル
で確認して下さい。

上の表にあげたものが、C言語の標準装備の文字検査・変換の関数ですが、日本のCコンパイラ
では、他に2バイト文字コードの検査用関数が各種用意されています。
例えばLSIC86では、以下のような関数があります。(以下、LSIC86のマニュアルから抜粋)

以下の関数は1バイトの文字コードcが以下のそれぞれの条件を満たすかどうかを判定し、
満たすなら0でない値を、そうでなければ0を返します。

iskana() カタカナのコード(0xA1 <= c <= 0xDF) かどうか
iskpun()  カタカナの区切り文字(0xA1 <= c <= 0xA6) かどうか
iskmoji()  カタカナの文字(0xA7 <= c <= 0xDF) かどうか
isalkana()  アルファベットまたはカタカナかどうか。これは(isalpha(c) || iskana(c))
と同じです
ispnkana()  ASCIIまたはカタカナの区切り文字かどうか。これは(ispunct(c) || iskpun(c))
と同じです
isalnmkana()  アルファベット、数字またはカタカナかどうか。これは(isalnum(c) ||
iskana(c))
と同じです
isprkana()  印字可能なASCII文字あるいはカタカナかどうか。これは(isprint(c) ||
iskana(c))
と同じです
isgrkana()  目に見えるASCII文字あるいはカタカナかどうか。これは(isgraph(c) ||
iskana(c))
と同じです
iskanji()  シフト JIS コードの1バイト目(0x81 <= c <= 0x9F あるいは0xE0 <= c
<= 0xFC) かどうか
iskanji2()  シフトJISコードの2バイト目(0x40 <= c <= 0x7E あるいは0x80  <=  c
<= 0xFC) かどうか

以下の関数は2バイトの文字コード(シフトJIS) cが以下のそれぞれのクラスに属するかどうか
を判定し、属するなら0でない値を、そうでなければ0を返しま
す。 2バイトコードは
1バイト目が上位バイト、2バイト目が下位バイトには
いっていなければなりません。
jiszen()  全角文字(0x8140 <= c <= 0xEFFC) かどうか
jisl0()  漢字以外の文字(0x8140 <= c <= 0x889E) かどうか
jisl1()  JIS第1水準(0x889F <= c <= 0x9872) かどうか
jisl2()  JIS第2水準(0x989F <= c <= 0xEA9E) かどうか
jisalpha()  全角英字かどうか
jisupper() 全角英大文字かどうか
jislower() 全角英小文字かどうか
jisdigit()  全角数字かどうか
jiskata()  全角カタカナかどうか
jishira()  全角ひらがなかどうか
jiskigou()  全角句読点かどうか
jisspace()  全角のスペースかどうか


では、簡単な使用例をあげてみます。まずは、入力した文字が英小文字かどうかを
islowerで検査し、英小文字でないものは'*'に置き換えます。例えば、パスワード登録で
使用不可の文字が入力されていないかどうかのチェックなどで、使ったりすることが
あるでしょう。

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

main(){
char *c;
int i,len;
gets(c);
len=strlen(c);
for(i=0;i<len;i++) {
if(islower(c[i]))
printf("%c アルファベット小文字\n",c[i]);
else {printf("%c アルファベット小文字ではない\n",c[i]); c[i]='*';}
}
puts(c);
}

実行結果です。

D:\win95\C>islower
KasaYan86
K アルファベット小文字ではない
a アルファベット小文字
s アルファベット小文字
a アルファベット小文字
Y アルファベット小文字ではない
a アルファベット小文字
n アルファベット小文字
8 アルファベット小文字ではない
6 アルファベット小文字ではない
*asa*an**

D:\win95\C>

次は、toupperで入力した文字を英小文字に変換する例です

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

main(){
int c;
while((c=getchar())!=EOF){
putchar(toupper(c));}
}

実行例です。

D:\win95\C>toupper
kasayan
KASAYAN
toupper
TOUPPER
^C

D:\win95\C>

ユーティリティ系のプログラムを作成すると、これらの文字検査関数が必須となりますよね。
使い方に慣れて下さい。


TopPage