このページでは文字や文字列を大文字/小文字変換する方法や、その前提知識について解説します。
Contents
文字を扱うための前提知識
まず文字を扱うための前提知識について解説します。これを理解していれば大文字小文字変換するプログラムを作成することができます。
コンピュータにおける文字は数値
大文字 / 小文字変換を行う上で前提知識として知っておいていただきたいのが、文字も結局は数値(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 をインクルードする必要があります。
#include <ctype.h>
int toupper(int)
#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
を引くことで実現することができます。
オススメの参考書(PR)
C言語学習中だけど分からないことが多くて挫折しそう...という方には、下記の「スッキリわかるC言語入門」がオススメです!
まず学習を進める上で、参考書は2冊持っておくことをオススメします。この理由は下記の2つです。
- 参考書によって、解説の仕方は異なる
- 読み手によって、理解しやすい解説の仕方は異なる
ある人の説明聞いても理解できなかったけど、他の人からちょっと違った観点での説明を聞いて「あー、そういうことね!」って簡単に理解できた経験をお持ちの方も多いのではないでしょうか?
それと同じで、1冊の参考書を読んで理解できない事も、他の参考書とは異なる内容の解説を読むことで理解できる可能性があります。
なので、参考書は2冊持っておいた方が学習時に挫折しにくいというのが私の考えです。
特に上記の「スッキリわかるC言語入門」は、他の参考書とは違った切り口での解説が豊富で、他の参考書で理解できなかった内容に対して違った観点での解説を読むことができ、オススメです。題名の通り「なぜそうなるのか?」がスッキリ理解できるような解説内容にもなっており、C言語入門書としてもかなり分かりやすい参考書だと思います。
もちろんネット等でも色んな観点からの解説を読むことが出来ますので、分からない点は別の人・別の参考書の解説を読んで解決していきましょう!もちろん私のサイトも参考にしていただけると嬉しいです!
入門用のオススメ参考書は下記ページでも紹介していますので、こちらも是非参考にしていただければと思います。
https://daeudaeu.com/c_reference_book/