文字の検索関数〜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