C言語関数:isalpha





C言語のページでは、次の内容を解説しております。
C言語の入門講座  C言語の文法を中心に、基本的な関数などの解説をしています。
C言語ケーススタディ  C言語での実践的なプログラミングについて解説をしています。
C言語の関数リファレンス  C言語で用意されている関数を解説しています。
C言語で3次元動画プログラム  C言語で3次元タートルグラフィックを使用した3次元の動画プログラムの作成例です。
C言語の検定試験  C言語の文法に関する検定試験を実施することができます。
C言語でゲーム作成  C言語を使用したゲームの作り方を解説したページも用意しております。



2014年10月より個人の方を対象に、Study C無料提供を開始しました。
C言語を勉強中の方は、学習・教育に最適なC言語インタープリタのStudy Cを使ってみてください(個人の方は無料です)。
大学・高専・高校などの教育機関での採用実績も多数あるロングセラー商品Study Cが、個人向けに無料提供を始めました。
インタープリタの手軽さに加え、ゲームや3Dタートルグラフィックで楽しく勉強したりと、C言語の学習を協力にサポートします。
ブロック崩しゲーム 3Dツリー クリスマスツリー
また、このようなボタンの用意されているページでは、掲載しているプログラムをStudy Cに直接ロードし実行したりすることができます。
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する
Study C無料利用についての詳細は、このページを参照してください。




■isalpha
cが英字か判定

【分類】
文字関数

【書式】
int isalpha(int c);

【パラメータの型と説明】

パラメータ説明
int c判定する文字

【機能説明】
cの文字が'A'〜'Z'/'a'〜'z'の場合は0以外の値、それ以外の場合は0を返します。

Study Cを使用している場合は、下記のようにコマンドラインから実行(exprコマンドを使用)して動作を確認することができます。

C:\StudyC\MyProg>expr isalpha('a')
<int>8 0x8

C:\StudyC\MyProg>expr isalpha('A')
<int>4 0x4

C:\StudyC\MyProg>expr isalpha('1')
<int>0 0x0

※↑カーソルキーを押すと入力したコマンドが呼び出されるので文字を変更して試してみてください。 1番目と2番目は英文字なので0以外となります。
3番目は数字なので0となります。

通常のコンパイラを使用する場合の使用例は下記になります(もちろんStudy CでもOKです)。

#include <stdio.h>

main()
{
        printf("%d\n", isalpha('a'));
        printf("%d\n", isalpha('A'));
        printf("%d\n", isalpha('1'));
}

実行結果は以下になります。

8
4
0

ところで、この関数はTRUEとして8とか4(1とか-1ではなく)という中途半端な値が返してきます。 同じ値を返さないというのも不思議に感じるかもしれません。 これはC言語でよく使われるテクニック(少しでも処理スピードを早くする為)によるものです。

次のプログラムを見てください。このプログラムは0〜9までの数値を偶数、奇数、3の倍数に振る分けるプログラムです。 「%」演算子とif分を使えば振り分けることができますが、このプログラムでは使用していません。 checkという配列に偶数なら1、奇数なら2、3の倍数なら4という値をあらかじめセットしておきます。 例えば調べる値が「6」ならば、check[6]にセットされている値を調べます。 6は偶数で3の倍数なので1と4のORをとった値を設定しておきます。 こうしておくことで、check[6] & 1やcheck[6] & 4の結果で偶数、奇数、3の倍数か知ることができます。

#include <stdio.h>

unsigned char
        check[] = {1, 2, 1, 2|4, 1, 2, 1|4, 2, 1, 2|4};

int     iseven(int n);
int     isodd(int n);
int     is3multi(int n);


main()
{
        int     n;

        for (n = 0; n < 10; n++)
        {
                printf("%d...", n);
                if (iseven(n))
                {
                        printf("[偶数]");
                }
                if (isodd(n))
                {
                        printf("[奇数]");
                }
                if (is3multi(n))
                {
                        printf("[3の倍数]");
                }
                printf("\n");
        }
}

int     iseven(int n)
{
        return check[n] & 1;
}

int     isodd(int n)
{
        return check[n] & 2;
}

int     is3multi(int n)
{
        return check[n] & 4;
}

実行結果は以下になります。

0...[偶数]
1...[奇数]
2...[偶数]
3...[奇数][3の倍数]
4...[偶数]
5...[奇数]
6...[偶数][3の倍数]
7...[奇数]
8...[偶数]
9...[奇数][3の倍数]

このプログラムは0〜9までの値しかチェックできませんが、256個の配列を作れば文字コードに関しては全てチェックすることができます。 漢字などの2バイト文字は配列が大きくなりすぎるので、このような手法は使われていません(_ismbblead()/_ismbbtrail()関数で1バイトずつ別々にチェックします)。

isalpha()関数の場合は、チェック用の配列の英小文字に8、英大文字に4がセットされていて「8 OR 4」とAND演算を行って結果を返しています。 チェック配列は別のis...()関数でも共通で使われています。 英小文字をチェックするislower()関数は「8」とAND演算を行い、英大文字をチェックするisupper()関数は「4」とAND演算を行い結果を返します。

【参照関数】
isalnum
isascii
iscntrl
isdigit
isgraph
islower
isprint
ispunct
isspace
isupper
isxdigit