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

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

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

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

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

大文字 / 小文字変換を行う上で前提知識として知っておいていただきたいのが、文字も結局は数値(2進数)であるということです。

コンピュータは2進数しか理解できないため、文字も結局は2進数の数値なのです。

そして、例えば画面などに表示するときに、その数値をどの文字に割り当てて表示するかを決めているのが “文字コード” というものになります。コンピュータはその文字コードに従って、元々は2進数の数値を文字として描画しているだけなのです。

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

文字を数値で表示
#include <stdio.h>
  
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 なので、'E''e' よりも 32 小さいです。

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

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

小文字と大文字の値の差
printf("%d\n", 'a' - 'A');

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

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

大文字変換の仕方

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

スポンサーリンク

小文字変換の仕方

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

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

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

大文字小文字変換
#include <stdio.h>
  
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 型1つで、戻り値の型も char 型になります。

小文字から大文字への変換
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つの関数を使用したプログラム例は下記の通りです。

toupperとtolowerの使用例
#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 を引くことで実現することができます。

コメントを残す

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