Index

HOME > プログラムTOP > C++



C++の壺・文字確認篇

 C++の基本テクニックのTipsです。文字確認篇では、ある一文字が数字であるか、アルファベットであるかなど、文字の種類を確認する方法を扱います。
[index]   文字コード ... 基本的な文字コード
文字の確認 ... 文字確認の方法
is系マクロ ... is系マクロの利用

sasaraan programming

Exposition

●文字コード

 ある文字がどのタイプであるかを調べるには、文字コードから判断します。基本的な文字コードの配置は下表の通りです。なお、値の()内は16進値、[]付きの文字は制御文字を表します。
文字 文字 文字 文字
0(00)[NUL]32(20)(空白)64(40)@96(60)`
1(01)[SOH]33(21)!65(41)A97(61)a
2(02)[STX]34(22)"66(42)B98(62)b
3(03)[ETX]35(23)#67(43)C99(63)c
4(04)[EOT]36(24)$68(44)D100(64)d
5(05)[ENQ]37(25)%69(45)E101(65)e
6(06)[ACK]38(26)&70(46)F102(66)f
7(07)[BEL]39(27)'71(47)G103(67)g
8(08)[BS]40(28)(72(48)H104(68)h
9(09)[HT]41(29))73(49)I105(69)i
10(0a)[LF]42(2a)*74(4a)J106(6a)j
11(0b)[VT]43(2b)+75(4b)K107(6b)k
12(0c)[FF]44(2c),76(4c)L108(6c)l
13(0d)[CR]45(2d)-77(4d)M109(6d)m
14(0e)[SO]46(2e).78(4e)N110(6e)n
15(0f)[SI]47(2f)/79(4f)O111(6f)o
16(10)[DLE]48(30)080(50)P112(70)p
17(11)[DC1]49(31)181(51)Q113(71)q
18(12)[DC2]50(32)282(52)R114(75)r
19(13)[DC3]51(33)383(53)S115(76)s
20(14)[DC4]52(34)484(54)T116(74)t
21(15)[NAK]53(35)585(55)U117(75)u
22(16)[SYN]54(36)686(56)V118(79)v
23(17)[ETB]55(37)787(57)W119(7a)w
24(18)[CAN]56(38)888(58)X120(78)x
25(19)[EM]57(39)989(59)Y121(79)y
26(1a)[SUB]58(3a):90(5a)Z122(7a)z
27(1b)[ESC]59(3b);91(5b)[123(7b){
28(1c)[FS]60(3c)<92(5c)\124(7c)|
29(1d)[GS]61(3d)=93(5d)]125(7d)}
30(1e)[RS]62(3e)>94(5e)^126(7e)~
31(1f)[US]63(3f)?95(5f)_127(7f)[DEL]
 文字コードには、JIS, Shift-JIS, EUC, Unicode などがありますが、上記の範囲では、'\' (0x5c) , '~ ' (0x7e) , [DEL] (0x7f) 以外は同じ値と文字の対応となっています。
 (漢字などの2バイト文字は、文字コードの種類ごとにコード番号が異なります)

●文字の確認

 文字の確認には、前節であげた文字コードから判断します。値(10進、16進、8進)を使っても文字('x')を使っても同じ結果となります。
#include <stdio.h>     // printf
#include <conio.h>    // getch

// 数字の文字確認
bool isnumeric(char c)
{
    if (48 <= c && c <= 57) {
        return true;
    }
    return false;
}

// main 関数
void main() 
{
    char c = 'f';
    bool b = isnumeric(c);
    printf("%d\n", b);    // = 0
    if (getch()) return;
}
#include <stdio.h>     // printf
#include <conio.h>    // getch

// アルファベットの文字確認
bool isalphabet(char c)
{
    if (('A' <= c && c<= 'Z') || 
        ('a' <= c && c <= 'z')) 
        return true;
    return false;
}

// main 関数
void main() 
{
    char c = 'f';
    bool b = isalphabet(c);
    printf("%d\n", b);    // = 1
    if (getch()) return;
} 

●is系マクロ

 C/C++ では、文字の種類の確認のために、以下のような関数が用意されています。また、ライブラリによっては、様々な種類のis系関数が定義されています。(isw...系、ismbc...系、jis...系、など)
is... macro
・書式int is_pattern( int c );
・機能文字がpatternであるかの確認
・引数c ... 確認する文字
・戻り値文字がpatternなら0以外、それ以外は0
・要件ctype.h のインクルード
is_pattern isdigit数字 : 0...9
isxdigit16進の数字 : 0...9, A...F, a...f
isalphaアルファベット : A...Z, a...z
isalnumアルファベットか数字 : 0...9, A...Z, a...z
isupper大文字 : A...Z
islower小文字 : a...z
iscntrl制御文字 : 0x00...0x1f, 0x7f
isspace空白、タブ、改行 : 0x09...0x0d, 0x20
ispunct区切り文字(isalnumと空白以外)
isprint印字可能文字 : 0x20...0x7e
isgraph空白以外の印字可能文字
#include <stdio.h>
#include <conio.h>
#include <ctype.h>

// main 関数
void main() 
{
    char c = 'f';
    int n;

    n = isdigit(c);                       // 数字
    printf("%d\n", n);                 // = 0
    n = isalpha(c);                      // アルファベット
    printf("%d\n", n);                 // = 1
    n = (isdigit(c) || isspace(c));   // 数字か空白
    printf("%d\n", n);                 // = 0

    if (getch()) return;
} 

www.sasaraan.net

(c) morijoh