C言語 大文字・小文字の変換方法【自作する場合の考え方も解説】

C言語
この記事は約10分で読めます。

こんにちは、ナナです。

文字列を加工するプログラムを作っている方は、英語の大文字と小文字を変換したいシーンに出くわすことがあるでしょう。

C言語には、標準ライブラリ関数に英語の大文字・小文字の変換関数が用意されています。

このような変換関数を使うこともできますし、大文字・小文字程度の変換であれば自作することも容易です。

本記事では次の疑問点を解消する内容となっています。

本記事で学習できること
  • 英大文字変換用のtoupper関数の仕様と使い方
  • 英小文字変換用のtolower関数の仕様と使い方
  • 文字列を大文字・小文字へ変換するサンプルプログラムの紹介
  • 大文字・小文字の変換関数を自作する際の考え方とサンプルプログラムの紹介

それでは、大文字・小文字の変換方法について学んでいきましょう。

スポンサー

大文字・小文字変換の標準ライブラリ関数

C言語には、英語の大文字・小文字を相互に変換するための標準ライブラリ関数が用意されています。

#include <ctype.h>

int toupper(int c);
int tolower(int c);

「toupper」とは「to(~へ)」「upper(大文字)」を省略した名前であり、「大文字へ変換する」という意味です。

「lower(小文字)」の場合は「小文字へ変換する」という意味になります。

ナナ

関数名の頭には「is(~かどうか?)」とか「to(~へ)」といった、英語の文法を名称にしたものが結構あります。

このような名前の付け方は覚えておくと、自分の作った関数名にも応用できますよ!

toupper関数の仕様と使い方

引数で指定された英小文字を、英大文字へ変換するための関数です。

includeファイルctype.h
関数仕様int toupper(int c);
第1引数変換対象となる文字。
戻り値大文字へ変換した文字。
特記事項引数が英小文字以外の場合は、引数の文字がそのまま出力される。

使い方をプログラムで示しましょう。引数で入力した文字が、大文字に変換され戻り値として出力されます。

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

int main(void)
{
	printf("a => %c\n", toupper('a'));
	printf("f => %c\n", toupper('f'));
	printf("A => %c\n", toupper('A'));
	printf("$ => %c\n", toupper('$'));

	return 0;
}
a => A
f => F
A => A
$ => $
ナナ

英小文字以外の文字の場合は、何も変換されずに戻り値となることは知っておきましょう!

tolower関数の仕様と使い方

引数で指定された英大文字を、英小文字へ変換するための関数です。

includeファイルctype.h
関数仕様int tolower(int c);
第1引数変換対象となる文字。
戻り値小文字へ変換した文字。
特記事項引数が英大文字以外の場合は、引数の文字がそのまま出力される。

使い方をプログラムで示しましょう。引数で入力した文字が、小文字に変換され戻り値として出力されます。

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

int main(void)
{
	printf("A => %c\n", tolower('A'));
	printf("F => %c\n", tolower('F'));
	printf("a => %c\n", tolower('a'));
	printf("$ => %c\n", tolower('$'));

	return 0;
}
A => a
F => f
a => a
$ => $
ナナ

使い方は非常にシンプルですね。引数で渡した文字が、変換されて戻り値で出力される。典型的なサービスとしての関数形式です。

スポンサー

文字列を大文字・小文字へ一括変換するプログラム

実際の開発の中では、「文字」を変換するよりも、「文字列」を一括で変換したい場面の方が多いかもしれません。

このような場合は、皆さんが反復処理にて文字列内の文字を逐次変換する必要があります。

文字列を大文字へ変換するサンプルプログラム

それでは文字列「Hello World!」を、英大文字へと変換するサンプルプログラムを紹介しましょう。

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

int main(void)
{
	size_t i;

	char moji[] = "Hello World!";

	for (i=0 ; i < strlen(moji) ; i++)
	{
		moji[i] = toupper(moji[i]);
	}

	printf("%s", moji);

	return 0;
}
HELLO WORLD!

小文字へ変換したい場合は、「toupper関数」を「tolower関数」へ変更すればよいだけです。

ナナ

このような文字列の場合は、C言語では1文字ずつを順に変換していくしかありません。

文字列を大文字へ変換する関数のサンプルプログラム

文字列を毎回反復処理で変換するのは面倒ですので、文字列を変換する関数を作ってしまえば便利ですね。

次のプログラムは、引数で指定された文字列を英大文字へと変換する「toupperString関数」の作成例です。

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

//	文字列を大文字へ変換する
int touppperString(char * str)
{
	size_t i;

	if (str == NULL)
	{
		return -1;
	}

	for (i = 0; i < strlen(str); i++)
	{
		str[i] = toupper(str[i]);
	}

	return 0;
}

int main(void)
{
	char moji[] = "Hello World!";

	touppperString(moji);

	printf("%s", moji);

	return 0;
}
HELLO WORLD!

サービスを受けたいmain関数側の処理は、かなり記述内容がすっきりしましたね。

ナナ

プログラムというものはこのように便利な部品を少しずつ作っていき、開発を楽にしていくものなのです。

スポンサー

大文字・小文字へ変換する関数を自分で作ってみよう!

「toupper関数」や「tolower関数」は、処理内容としては大したことをしていません。

それでは自分で作成してみましょう!

ナナ

このような標準ライブラリ関数の仕様を満たすように、自分で関数を作ってみると様々な関数の中身をイメージする力が付きます。

プログラミングを始めたばかりの人は、練習と思ってやってみるとよいですよ!

英大文字と英小文字の関係性とは?

文字というものはコンピュータの中では、ただの数値です。数値に対して特定の文字を紐づけているだけなのです。

英小文字や英大文字は「アスキーコード」と呼ばれる対応表にて一意に数値が決まっています。英小文字と英大文字の部分のみを下記に抜粋してみます。

16進数英大文字16進数英小文字
0x41A0x61a
0x42B0x62b
0x43C0x63c
0x44D0x64d
0x45E0x65e
0x46F0x66f
0x47G0x67g
0x48H0x68h
0x49I0x69i
0x4AJ0x6Aj
0x4BK0x6Bk
0x4CL0x6Cl
0x4DM0x6Dm
0x4EN0x6En
0x4FO0x6Fo
0x50P0x70p
0x51Q0x71q
0x52R0x72r
0x53S0x73s
0x54T0x74t
0x55U0x75u
0x56V0x76v
0x57W0x77w
0x58X0x78x
0x59Y0x79y
0x5AZ0x7Az

このように「文字」とは、何らかの数値と1対1で紐づいているのです。

皆さんこのアスキーコードをよく見てください。規則性があるのがわかりますか?

それでは答えです。「英大文字」と「小文字」の数値には、次の規則性があることがわかりますね。

英大文字と英小文字のアスキーコードの規則
  • 「A」「B」「C」・・・の順に数値が1つずつ上昇している
  • 「A」と「a」、「B」と「b」・・・は数値として「0x20」の差分となっている

この規則性を利用して、英大文字・英小文字の変換プログラムを作っていきます。

ナナ

「規則性を見つけ出す」という視点はプログラマーにとって非常に大事な力です。プログラムとは規則性を見つけ、コード化することだからです。

文字やアスキーコードについて詳しく知りたい方は『文字と文字列を図解【何が違うのこの2つ?解決します】』を読んでおくとよいでしょう!

大文字・小文字への自作変換関数のサンプルプログラム

それでは先ほどの規則性を利用して自作の大文字・小文字変換関数を作成してみましょう。

「toUpper関数」と「toLower関数」は次のように作ることができます。引数と戻り値の構成は同じものとしましょう。

#include <stdio.h>

int toUpper(int c)
{
	//	英小文字の場合は英大文字へ変換
	if ((c >= 'a') && (c <= 'z'))
	{
		return c - 0x20;
	}

	//	英小文字以外の場合
	return c;
}

int toLower(int c)
{
	//	英大文字の場合は英小文字へ変換
	if ((c >= 'A') && (c <= 'Z'))
	{
		return c + 0x20;
	}

	//	英大文字以外の場合
	return c;
}

int main(void)
{
	printf("toUpper\n");
	printf("a => %c\n", toUpper('a'));
	printf("f => %c\n", toUpper('f'));
	printf("z => %c\n", toUpper('z'));
	printf("A => %c\n", toUpper('A'));
	printf("$ => %c\n", toUpper('$'));

	printf("toLower\n");
	printf("A => %c\n", toLower('A'));
	printf("F => %c\n", toLower('F'));
	printf("Z => %c\n", toLower('Z'));
	printf("a => %c\n", toLower('a'));
	printf("$ => %c\n", toLower('$'));

	return 0;
}
toUpper
a => A
f => F
z => Z
A => A
$ => $
toLower
A => a
F => f
Z => z
a => a
$ => $

それぞれ、入力文字の範囲をチェックし変換対象の文字かを確認します。変換対象であれば±0x20をすることで変換できます。

ナナ

このように変換ルールをうまく使うことで、簡単にプログラミングすることができます。