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

文字の検索関数〜isalpha,isdigitの使用例
(準備中)

文字検査・変換関数 のうちisalpha,isdigitの使用例の具体的な説明

isalpha,isdigitはそれぞれ文字がアルファベットか数値かを調べて、
アルファベットまたは数値なら真を返し、違う場合は偽を返す関数。

C言語の場合、偽は0なので違う場合は0が戻り値として返ってくるが、真は0以外なので
処理系(コンパイラ)によって返ってくる戻り値が異なる。
なので、真であるかどうかの判定は、
isalpha != 0
isdigit != 0
と書いておけばどの処理系でも使える。

isalpha.c
入力した文字列を1文字づつisalpha,isdigitでアルファベットか数値か調べて戻り値を表示する。

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

int main(void) {
 char *s;
 int i,len;
        
        gets(s);
        len=strlen(s);
        printf("isalpha\n");
        for (i=0; i<len; i++) {
        printf("%c -> isalpha %d\n",s[i], isalpha(s[i]));
        }
        printf("isdigit\n");
        for (i=0; i<len; i++) {
        printf("%c -> isdigit %d\n",s[i], isdigit(s[i]));
        }
        
 return 0; }


Borland C++ 5.5.1 でコンパイルして実行
文字がアルファベットの場合、isalphaは256を返す。
文字が数値の場合、isdigitは4を返してくる。

c:\bcc55\Bin>isalpha
012789abcd%&()=+*
isalpha
0 -> isalpha 0
1 -> isalpha 0
2 -> isalpha 0
7 -> isalpha 0
8 -> isalpha 0
9 -> isalpha 0
a -> isalpha 256
b -> isalpha 256
c -> isalpha 256
d -> isalpha 256
% -> isalpha 0
& -> isalpha 0
( -> isalpha 0
) -> isalpha 0
= -> isalpha 0
+ -> isalpha 0
* -> isalpha 0
isdigit
0 -> isdigit 4
1 -> isdigit 4
2 -> isdigit 4
7 -> isdigit 4
8 -> isdigit 4
9 -> isdigit 4
a -> isdigit 0
b -> isdigit 0
c -> isdigit 0
d -> isdigit 0
% -> isdigit 0
& -> isdigit 0
( -> isdigit 0
) -> isdigit 0
= -> isdigit 0
+ -> isdigit 0
* -> isdigit 0



LSIC86でコンパイルした場合
文字がアルファベットの場合、isalphaは1を返す。
文字が数値の場合、isdigitも1を返してくる。
処理系(コンパイラ)により真の場合の戻り値が違う。

C:\LSIC86\BIN>isalpha
012abc$%+
isalpha
0 -> isalpha 0
1 -> isalpha 0
2 -> isalpha 0
a -> isalpha 1
b -> isalpha 1
c -> isalpha 1
$ -> isalpha 0
% -> isalpha 0
+ -> isalpha 0
isdigit
0 -> isdigit 1
1 -> isdigit 1
2 -> isdigit 1
a -> isdigit 0
b -> isdigit 0
c -> isdigit 0
$ -> isdigit 0
% -> isdigit 0
+ -> isdigit 0


Visual Studio2022 のisalpha.c
Visual Studio2015以降標準入力関数getsは使えず、セキュリティを強化したgets_sを使う必要がある。
また文字数をカウントするstrlenの戻り値はsize_t型なので、変数len(文字数を保持する変数)にはintにキャスト
して代入している。 他の個所は同じコード

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

int main(void) {
        char s[30];
        int i,len;

        gets_s(s,30);
        len = (int)strlen(s);
        printf("isalpha\n");
        for (i = 0; i < len; i++) {
                printf("%c -> isalpha %d\n", s[i], isalpha(s[i]));
        }
        printf("isdigit\n");
        for (i = 0; i < len; i++) {
                printf("%c -> isdigit %d\n", s[i], isdigit(s[i]));
        }


        return 0;
}

文字がアルファベットの場合、isalphaは2を返す。
文字が数値の場合、isdigitは4を返してくる。
処理系(コンパイラ)により真の場合の戻り値が違う。

12389abcd$%&+*
isalpha
1 -> isalpha 0
2 -> isalpha 0
3 -> isalpha 0
8 -> isalpha 0
9 -> isalpha 0
a -> isalpha 2
b -> isalpha 2
c -> isalpha 2
d -> isalpha 2
$ -> isalpha 0
% -> isalpha 0
& -> isalpha 0
+ -> isalpha 0
* -> isalpha 0
isdigit
1 -> isdigit 4
2 -> isdigit 4
3 -> isdigit 4
8 -> isdigit 4
9 -> isdigit 4
a -> isdigit 0
b -> isdigit 0
c -> isdigit 0
d -> isdigit 0
$ -> isdigit 0
% -> isdigit 0
& -> isdigit 0
+ -> isdigit 0
* -> isdigit 0


ついでに、isalpha,isdigitと同等の関数を自分で実装してみた。
文字がアルファベットまたは数値の場合は、その文字のアスキーコードを返し、
違う場合は偽(0)を返すようにしてみた。

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

int myisalpha(char);
int myisdigit(char);

int main(void) {
 char *s;
 int i,len;
        
        gets(s);
        len=strlen(s);
        printf("isalpha\n");
        for (i=0; i<len; i++) {
        printf("%c -> isalpha %d\n",s[i], myisalpha(s[i]));
        }
        printf("isdigit\n");
        for (i=0; i<len; i++) {
        printf("%c -> isdigit %d\n",s[i], myisdigit(s[i]));
        }
        

 return 0; }
 
myisalpha (char c) {
        int r;
        if ((c >=65 && c<=90) || (c >=97 && c<=122)) r=(int)c; else r=0;
        return(r);}
        
myisdigit (char c){
        int r;
        if (c >=48 && c<=57)  r=(int)c; 
        else r=0;
        return(r);}

c:\bcc55\Bin>myisalpha
01289ABYZabyz&%$+*
isalpha
0 -> isalpha 0
1 -> isalpha 0
2 -> isalpha 0
8 -> isalpha 0
9 -> isalpha 0
A -> isalpha 65
B -> isalpha 66
Y -> isalpha 89
Z -> isalpha 90
a -> isalpha 97
b -> isalpha 98
y -> isalpha 121
z -> isalpha 122
& -> isalpha 0
% -> isalpha 0
$ -> isalpha 0
+ -> isalpha 0
* -> isalpha 0
isdigit
0 -> isdigit 48
1 -> isdigit 49
2 -> isdigit 50
8 -> isdigit 56
9 -> isdigit 57
A -> isdigit 0
B -> isdigit 0
Y -> isdigit 0
Z -> isdigit 0
a -> isdigit 0
b -> isdigit 0
y -> isdigit 0
z -> isdigit 0
& -> isdigit 0
% -> isdigit 0
$ -> isdigit 0
+ -> isdigit 0
* -> isdigit 0



TopPage