C言語での大文字 ⇔ 小文字変換の方法を解説

このページでは文字や文字列を大文字/小文字変換する方法や、その前提知識について解説します。

文字を扱うための前提知識

まず文字を扱うための前提知識について解説します。これを理解していれば大文字小文字変換するプログラムを作成することができます。

コンピュータにおける文字は数字

大文字/小文字変換を行う上で前提知識として知っておいていただきたいのが、文字も結局は数字(2進数)であるということです。コンピュータは2進数しか理解できないため、文字も結局は2進数の数字なのです。そして、例えば画面などに表示するときに、その数字をどの文字に割り当てて表示するかを決めているのが文字コードというものになります。コンピュータはその文字コードに従って、元々は2進数の数字を文字として描画しているだけなのです。

これは実際に下記のようなプログラムを実行してみると分かると思います。

#include 
  
int main(void){
    char c = 'H';

    printf("moji  :  %c\n", c);
    printf("suuji :  %d\n", c);

    return 0;
}

結果は下記のようになり、同じ変数 c を表示しているのに、一回目の表示では文字が、二回目の表示では10進数が表示されていることが確認できます。

moji  :  H
suuji :  72

表示が異なるのは、変換指定子が異なるためです(%c と %d)。printf関数では %c だと引数の値を文字として表示し、 %d だと引数の値を10進数で表示します。

つまり、もともとは同じ数字の「72」なのですが、表示の仕方を変えることで「文字のH」や「数字の72」で表示することができるのです。

アスキーコード表

実際にどの数字(10進表記)がどの文字に割り当たっているかは、アスキーコード表を見るのが手っ取り早いです。ココではa – z と A – Z の文字のみ取り上げて紹介します。括弧内が文字を10進数に置き換えた時の値です。

A
(65)
B
(66)
C
(67)
D
(68)
E
(69)
F
(70)
G
(71)
H
(72)
I
(73)
J
(74)
K
(75)
L
(76)
M
(77)
N
(78)
O
(79)
P
(80)
Q
(81)
R
(82)
S
(83)
T
(84)
U
(85)
V
(86)
W
(87)
X
(88)
Y
(89)
Z
(90)

a
(97)
b
(98)
c
(99)
d
(100)
e
(101)
f
(102)
g
(103)
h
(104)
i
(105)
j
(106)
k
(107)
l
(108)
m
(109)
n
(110)
o
(111)
p
(112)
q
(113)
r
(114)
s
(115)
t
(117)
u
(118)
v
(119)
w
(120)
x
(120)
y
(121)
z
(122)

ポイントは、大文字と小文字はそれぞれ「32(10進数)」 離れているところです。大文字は小文字に対して「32」小さく、小文字は大文字に対して「32」大きいです(小文字の方が値は小さそうですが、実際には大きいので注意が必要です)。

例えば「E」は「69」なので、「e」は「101」に対して「32」小さいです。他の文字も大文字と小文字は全てこの「32離れている」という関係があります。つまり、この「32」を足したり引いたりすることで文字を大文字から小文字もしくは小文字から大文字に変換することが可能です。

ちなみにこの「32」という数字は下記のように、小文字の文字から大文字の文字の差分からも求めることができます。なので、この「32」という数字を忘れてしまっても下記を実行すればすぐに確認することが可能です。

printf("%d\n", 'a' - 'A');

文字を大文字 ⇔ 小文字変換

では実際に文字を大文字/小文字変換していきましょう。

大文字変換の仕方

小文字から大文字への変換は、小文字の文字の値を「32(’a’ – ‘A’)」で引くことで実行することが可能です。

小文字変換の仕方

大文字から小文字への変換は、大文字の文字の値を 「32(’a’ – ‘A’)」で足してやることで実行することが可能です。

大文字/小文字変換のプログラム例

文字を大文字/小文字変換するプログラムは下記のようになります。

#include 
  
char upper(char);
char lower(char);

char upper(char c){
    if('a' <= c && c <= 'z'){
        c = c - ('a' - 'A');
    }
    return c;
}

char lower(char c){
    if('A' <= c && c <= 'Z'){
        c = c + ('a' - 'A');
    }
    return c;
}

int main(void){
    char c;

    c = lower('H');
    printf("%c\n", c);

    c = upper('h');
    printf("%c\n", c);

    return 0;
}

プログラムのポイント

下記が小文字を大文字に変換する関数です。

char upper(char c){
    if('a' <= c && c <= 'z'){
        c = c - ('a' - 'A');
    }
    return c;
}

if('a' <= c && c <= 'z')で入力された文字 c が小文字であるかどうかの判断をしています。小文字である場合はc = c - ('a' - 'A')で文字 c から 32 (’a’ – ‘A’は 32 )を引いています。小文字以外が入力された場合は入力された文字をそのままリターンする関数になります。

下記が大文字を小文字に変換する関数です。引数はchar型1つで、戻り値の型もchar型になります。

char lower(char c){
    if('A' <= c && c <= 'Z'){
        c = c + ('a' - 'A');
    }
    return c;
}

if('A' <= c && c <= 'Z')で入力された文字 c が大文字であるかどうかの判断をしています。大文字である場合はc = c + ('a' - 'A')で文字 c から 32 (’a’ – ‘A’は 32 )を足しています。大文字以外が入力された場合は入力された文字をそのままリターンする関数になります。

toupper関数とtolower関数

ちなみに標準関数で大文字変換する関数と小文字変換する関数が用意されていますtoupper関数とtolower関数です。引数と戻り値の型が int になっていますが、基本的に先ほど紹介したプログラムのupper関数とlower関数と同じようにして使用することができます。これらの関数を使用する場合は ctype.h をインクルードする必要があります。

toupper

#include <ctype.h>

int toupper(int)

tolower

#include <ctype.h>

int tolower(int)

この2つの関数を使用したプログラム例は下記の通りです。

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

int main(void){
    char c;

    c = tolower('H');
    printf("%c\n", c);

    c = toupper('h');
    printf("%c\n", c);

    return 0;
}

スポンサーリンク

文字列を大文字/小文字変換

文字だけじゃなくて文字列単位で大文字小文字変換する関数も用意してみました。下記のプログラムになります。

#include <stdio.h>

void upperstring(char*, const char*);
void lowerstring(char*, const char*);
char upper(char);
char lower(char);

void upperstring(char *out, const char *in){
    int i;

    i = 0;
    while(in[i] != '\0'){
        out[i] = upper(in[i]);
        i++;
    }
}

void lowerstring(char *out, const char *in){
    int i;
    
    i = 0; 
    while(in[i] != '\0'){
        out[i] = lower(in[i]);
        i++;
    }
}

char upper(char c){
    if('a' <= c && c <= 'z'){
        c = c - ('a' - 'A');
    }
    return c;
}

char lower(char c){
    if('A' <= c && c <= 'Z'){
        c = c + ('a' - 'A');
    }
    return c;
}

int main(void){
    char s[20];

    upperstring(s, "I am a CAT");
    printf("%s\n", s);

    lowerstring(s, "I am a CAT");
    printf("%s\n", s);

    return 0;
}

upperstring関数が第二引数の文字列を全て大文字に変換する関数で、lowerstring関数が第二引数の文字列を小文字に変換する関数です。変換した結果は第一引数で指定された文字列に格納されます。

大したことは行なっておらず、それぞれ1文字ずつ大文字 or 小文字に変換するだけの関数です。入力される文字列に終端文字’\0’があることを前提にしている関数になっていますのでその点だけ注意してください。

まとめ

文字も結局は数字なので、足し算引き算により文字を変換することが可能です。大文字の小文字への変換は、文字の値に32を足し、小文字の大文字への変換は、文字の値から32を引くことで実現することができます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です