C言語で文字を分類する方法を教えて!
こういった悩みにお答えします.
本記事の信頼性
- リアルタイムシステムの研究歴12年.
- 東大教員の時に,英語でOS(Linuxカーネル)の授業.
- 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校(UNC)コンピュータサイエンス学部で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発.
- プログラミング歴15年以上,習得している言語: C/C++,Python,Solidity/Vyper,Java,Ruby,Go,Rust,D,HTML/CSS/JS/PHP,MATLAB,Assembler (x64,ARM).
- 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」をGitHubにオープンソースとして公開.
- 2020年1月~現在はアメリカのノースカロライナ州チャペルヒルにあるGuarantee Happiness LLCのCTOとしてECサイト開発やWeb/SNSマーケティングの業務.2022年6月~現在はアメリカのノースカロライナ州チャペルヒルにあるJapanese Tar Heel, Inc.のCEO兼CTO.
- 最近は自然言語処理AIとイーサリアムに関する有益な情報発信に従事.
- (AI全般を含む)自然言語処理AIの論文の日本語訳や,AIチャットボット(ChatGPT,Auto-GPT,Gemini(旧Bard)など)の記事を50本以上執筆.アメリカのサンフランシスコ(広義のシリコンバレー)の会社でプロンプトエンジニア・マネージャー・Quality Assurance(QA)の業務委託の経験あり.
- (スマートコントラクトのプログラミングを含む)イーサリアムや仮想通貨全般の記事を200本以上執筆.イギリスのロンドンの会社で仮想通貨の英語の記事を日本語に翻訳する業務委託の経験あり.
こういった私から学べます.
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!
目次
ctype.hの関数
標準ライブラリのヘッダファイルctype.hには,C言語で文字を分類する関数のプロトタイプ宣言があります.
ctype.hの関数は以下になります.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
int isalnum(int c); int isalpha(int c); int isascii(int c); int isblank(int c); int iscntrl(int c); int isdigit(int c); int isgraph(int c); int islower(int c); int isprint(int c); int ispunct(int c); int isspace(int c); int isupper(int c); int isxdigit(int c); |
どの関数もint型の文字cを引数に取ります.
関数の返り値は,cが文字の種類にあっていれば0以外,そうでなければ0になります.
- isalnum関数:英字または数字であるかを調べます.「(isalpha(c) || isdigit(c))」と同じです.
- isalpha関数:アルファベットかどうかを調べます.「(isupper(c) || islower(c))」と同じです.
- isascii関数:ASCIIコードに合致する 7ビットのunsigned charであるかを調べます.
- isblank関数:空白文字(スペースかタブ)であるかを調べます.タブは水平タブ('\t')のみで垂直タブ('\v')を含みません.
- iscntrl関数:制御文字かどうかを調べます.
- isdigit関数:数字(0〜9)かどうかを調べます.
- isgraph関数:表示可能な文字かどうかを調べます.スペースは含みません.
- islower関数:小文字かどうかを調べます.
- isprint関数:表示可能な文字かどうかを調べます.スペースは含みます.
- ispunct関数:表示可能な文字かどうかを調べます.スペースと英数字は含みません.
- isspace関数:空白文字()かどうかを調べます.空白文字とは,スペース(' '),フォームフィード('\f'),改行(newline)('\n'),復帰(carriage return)('\r'),水平タブ('\t'),垂直タブ('\v')です.
- isupper関数:大文字かどうかを調べます.
- isxdigit関数:16進数の数字かどうかを調べます.(0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F の文字であるかどうかを調べることと同じです.)
ctype.hの関数の使い方
ctype.hの関数の使い方は以下になります.
8行目の#defineで'\xffという見慣れない書き方がありますが,これは16進ビットパターンという表記法で,16進数の0xff(10進数の255)という意味になります.
同様に,9行目の'\x7f'は16進数の0x7f(10進数の127)になります.
16進ビットパターンは,データ型のエスケープシーケンスで解説しています.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #include <ctype.h> #define _FF ((unsigned char) '\xff') /* '\xff' = 255 */ #define _7F ((unsigned char) '\x7f') /* '\x7f' = 127 */ int main(void) { printf("isalnum(%3d) = %d\n", 'a', isalnum('a')); printf("isalnum(%3d) = %d\n", '0', isalnum('0')); printf("isalnum(%3d) = %d\n", ';', isalnum(';')); printf("isalpha(%3d) = %d\n", 'a', isalpha('a')); printf("isalpha(%3d) = %d\n", '0', isalpha('0')); printf("isascii(%3d) = %d\n", 'a', isascii('a')); printf("isascii(%3d) = %d\n", _FF, isascii(_FF)); printf("isblank(%3d) = %d\n", ' ', isblank(' ')); printf("isblank(%3d) = %d\n", '\t', isblank('\t')); printf("isblank(%3d) = %d\n", '\v', isblank('\v')); printf("isblank(%3d) = %d\n", '0', isblank('0')); printf("iscntrl(%3d) = %d\n", '\0', iscntrl('\0')); printf("iscntrl(%3d) = %d\n", _7F, iscntrl(_7F)); printf("iscntrl(%3d) = %d\n", '0', iscntrl('0')); printf("isdigit(%3d) = %d\n", '0', isdigit('0')); printf("isdigit(%3d) = %d\n", 'a', isdigit('a')); printf("isgraph(%3d) = %d\n", 'a', isgraph('a')); printf("isgraph(%3d) = %d\n", '0', isgraph('0')); printf("isgraph(%3d) = %d\n", ' ', isgraph(' ')); printf("isgraph(%3d) = %d\n", _FF, isgraph(_FF)); printf("islower(%3d) = %d\n", 'a', islower('a')); printf("islower(%3d) = %d\n", 'A', islower('A')); printf("isprint(%3d) = %d\n", 'a', isprint('a')); printf("isprint(%3d) = %d\n", '0', isprint('0')); printf("isprint(%3d) = %d\n", ' ', isprint(' ')); printf("isprint(%3d) = %d\n", _7F, isprint(_7F)); printf("isprint(%3d) = %d\n", _FF, isprint(_FF)); printf("ispunct(%3d) = %d\n", ';', ispunct(';')); printf("ispunct(%3d) = %d\n", 'a', ispunct('a')); printf("ispunct(%3d) = %d\n", '0', ispunct('0')); printf("ispunct(%3d) = %d\n", ' ', ispunct(' ')); printf("ispunct(%3d) = %d\n", _FF, ispunct(_FF)); printf("isspace(%3d) = %d\n", ' ', isspace(' ')); printf("isspace(%3d) = %d\n", '\f', isspace('\f')); printf("isspace(%3d) = %d\n", '\n', isspace('\n')); printf("isspace(%3d) = %d\n", '\r', isspace('\r')); printf("isspace(%3d) = %d\n", '\t', isspace('\t')); printf("isspace(%3d) = %d\n", '\v', isspace('\v')); printf("isspace(%3d) = %d\n", 'a', isspace('a')); printf("isupper(%3d) = %d\n", 'a', isupper('a')); printf("isupper(%3d) = %d\n", 'A', isupper('A')); printf("isxdigit(%3d) = %d\n", 'a', isxdigit('a')); printf("isxdigit(%3d) = %d\n", 'A', isxdigit('A')); printf("isxdigit(%3d) = %d\n", '0', isxdigit('0')); printf("isxdigit(%3d) = %d\n", ' ', isxdigit(' ')); return 0; } |
実行結果は以下になります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
$ gcc ctype.c $ a.out isalnum( 97) = 8 isalnum( 48) = 8 isalnum( 59) = 0 isalpha( 97) = 1024 isalpha( 48) = 0 isascii( 97) = 1 isascii(255) = 0 isblank( 32) = 1 isblank( 9) = 1 isblank( 11) = 0 isblank( 48) = 0 iscntrl( 0) = 2 iscntrl(127) = 2 iscntrl( 48) = 0 isdigit( 48) = 2048 isdigit( 97) = 0 isgraph( 97) = 32768 isgraph( 48) = 32768 isgraph( 32) = 0 isgraph(255) = 0 islower( 97) = 512 islower( 65) = 0 isprint( 97) = 16384 isprint( 48) = 16384 isprint( 32) = 16384 isprint(127) = 0 isprint(255) = 0 ispunct( 59) = 4 ispunct( 97) = 0 ispunct( 48) = 0 ispunct( 32) = 0 ispunct(255) = 0 isspace( 32) = 8192 isspace( 12) = 8192 isspace( 10) = 8192 isspace( 13) = 8192 isspace( 9) = 8192 isspace( 11) = 8192 isspace( 97) = 0 isupper( 97) = 0 isupper( 65) = 256 isxdigit( 97) = 4096 isxdigit( 65) = 4096 isxdigit( 48) = 4096 isxdigit( 32) = 0 |
ctype.hの関数の自作関数
ctype.hの関数の自作関数は以下になります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #define _FF ((unsigned char) '\xff') /* '\xff' = 255 */ #define _7F ((unsigned char) '\x7f') /* '\x7f' = 127 */ int myisalpha(int c); int myisdigit(int c); int myisupper(int c); int myislower(int c); int myisalnum(int c) { return myisalpha(c) || myisdigit(c); } int myisalpha(int c) { return myisupper(c) || myislower(c); } int myisascii(int c) { return (c >= 0x00) && (c <= 0x7f); } int myisblank(int c) { return (c == ' ') || (c == '\t'); } int myiscntrl(int c) { return ((c >= 0x00) && (c <= 0x1f)) || (c == 0x7f); } int myisdigit(int c) { return (c >= '0') && (c <= '9'); } int myisgraph(int c) { return (c >= 0x21) && (c <= 0x7e); } int myislower(int c) { return (c >= 'a') && (c <= 'z'); } int myisprint(int c) { return (c >= 0x20) && (c <= 0x7e); } int myispunct(int c) { return ((c >= 0x21) && (c <= 0x2f)) || ((c >= 0x3a) && (c <= 0x40)) || ((c >= 0x5b) && (c <= 0x60)) || ((c >= 0x7b) && (c <= 0x7e)); } int myisspace(int c) { return (c == ' ') || (c == '\f') || (c == '\n') || (c == '\r') || (c == '\t') || (c == '\v'); } int myisupper(int c) { return (c >= 'A') && (c <= 'Z'); } int myisxdigit(int c) { return myisdigit(c) || ((c >= 'a') && (c <= 'f')) || ((c >= 'A') && (c <= 'F')); } int main(void) { printf("myisalnum(%3d) = %d\n", 'a', myisalnum('a')); printf("myisalnum(%3d) = %d\n", '0', myisalnum('0')); printf("myisalnum(%3d) = %d\n", ';', myisalnum(';')); printf("myisalpha(%3d) = %d\n", 'a', myisalpha('a')); printf("myisalpha(%3d) = %d\n", '0', myisalpha('0')); printf("myisascii(%3d) = %d\n", 'a', myisascii('a')); printf("myisascii(%3d) = %d\n", _FF, myisascii(_FF)); printf("myisblank(%3d) = %d\n", ' ', myisblank(' ')); printf("myisblank(%3d) = %d\n", '\t', myisblank('\t')); printf("myisblank(%3d) = %d\n", '\v', myisblank('\v')); printf("myisblank(%3d) = %d\n", '0', myisblank('0')); printf("myiscntrl(%3d) = %d\n", '\0', myiscntrl('\0')); printf("myiscntrl(%3d) = %d\n", _7F, myiscntrl(_7F)); printf("myiscntrl(%3d) = %d\n", '0', myiscntrl('0')); printf("myisdigit(%3d) = %d\n", '0', myisdigit('0')); printf("myisdigit(%3d) = %d\n", 'a', myisdigit('a')); printf("myisgraph(%3d) = %d\n", 'a', myisgraph('a')); printf("myisgraph(%3d) = %d\n", '0', myisgraph('0')); printf("myisgraph(%3d) = %d\n", ' ', myisgraph(' ')); printf("myisgraph(%3d) = %d\n", _FF, myisgraph(_FF)); printf("myislower(%3d) = %d\n", 'a', myislower('a')); printf("myislower(%3d) = %d\n", 'A', myislower('A')); printf("myisprint(%3d) = %d\n", 'a', myisprint('a')); printf("myisprint(%3d) = %d\n", '0', myisprint('0')); printf("myisprint(%3d) = %d\n", ' ', myisprint(' ')); printf("myisprint(%3d) = %d\n", _7F, myisprint(_7F)); printf("myisprint(%3d) = %d\n", _FF, myisprint(_FF)); printf("myispunct(%3d) = %d\n", ';', myispunct(';')); printf("myispunct(%3d) = %d\n", 'a', myispunct('a')); printf("myispunct(%3d) = %d\n", '0', myispunct('0')); printf("myispunct(%3d) = %d\n", ' ', myispunct(' ')); printf("myispunct(%3d) = %d\n", _FF, myispunct(_FF)); printf("myisspace(%3d) = %d\n", ' ', myisspace(' ')); printf("myisspace(%3d) = %d\n", '\f', myisspace('\f')); printf("myisspace(%3d) = %d\n", '\n', myisspace('\n')); printf("myisspace(%3d) = %d\n", '\r', myisspace('\r')); printf("myisspace(%3d) = %d\n", '\t', myisspace('\t')); printf("myisspace(%3d) = %d\n", '\v', myisspace('\v')); printf("myisspace(%3d) = %d\n", 'a', myisspace('a')); printf("myisupper(%3d) = %d\n", 'a', myisupper('a')); printf("myisupper(%3d) = %d\n", 'A', myisupper('A')); printf("myisxdigit(%3d) = %d\n", 'a', myisxdigit('a')); printf("myisxdigit(%3d) = %d\n", 'A', myisxdigit('A')); printf("myisxdigit(%3d) = %d\n", '0', myisxdigit('0')); printf("myisxdigit(%3d) = %d\n", ' ', myisxdigit(' ')); return 0; } |
実行結果は以下になります.
1の数値の箇所がctype.cの実行結果と異なりますが,0以外の数値という点では同じです.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
$ gcc myctype.c $ a.out myisalnum( 97) = 1 myisalnum( 48) = 1 myisalnum( 59) = 0 myisalpha( 97) = 1 myisalpha( 48) = 0 myisascii( 97) = 1 myisascii(255) = 0 myisblank( 32) = 1 myisblank( 9) = 1 myisblank( 11) = 0 myisblank( 48) = 0 myiscntrl( 0) = 1 myiscntrl(127) = 1 myiscntrl( 48) = 0 myisdigit( 48) = 1 myisdigit( 97) = 0 myisgraph( 97) = 1 myisgraph( 48) = 1 myisgraph( 32) = 0 myisgraph(255) = 0 myislower( 97) = 1 myislower( 65) = 0 myisprint( 97) = 1 myisprint( 48) = 1 myisprint( 32) = 1 myisprint(127) = 0 myisprint(255) = 0 myispunct( 59) = 1 myispunct( 97) = 0 myispunct( 48) = 0 myispunct( 32) = 0 myispunct(255) = 0 myisspace( 32) = 1 myisspace( 12) = 1 myisspace( 10) = 1 myisspace( 13) = 1 myisspace( 9) = 1 myisspace( 11) = 1 myisspace( 97) = 0 myisupper( 97) = 0 myisupper( 65) = 1 myisxdigit( 97) = 1 myisxdigit( 65) = 1 myisxdigit( 48) = 1 myisxdigit( 32) = 0 |
まとめ
ctype.hの関数で文字を分類する方法を紹介しました.
文字を分類する方法はよく利用するので,使いこなせるようにしましょう!
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!