C言語関数:toupper





C言語のページでは、次の内容を解説しております。
C言語の入門講座  C言語の文法を中心に、基本的な関数などの解説をしています。
C言語ケーススタディ  C言語での実践的なプログラミングについて解説をしています。
C言語の関数リファレンス  C言語で用意されている関数を解説しています。
C言語で3次元動画プログラム  C言語で3次元タートルグラフィックを使用した3次元の動画プログラムの作成例です。
C言語の検定試験  C言語の文法に関する検定試験を実施することができます。
C言語でゲーム作成  C言語を使用したゲームの作り方を解説したページも用意しております。



2014年10月より個人の方を対象に、Study C無料提供を開始しました。
C言語を勉強中の方は、学習・教育に最適なC言語インタープリタのStudy Cを使ってみてください(個人の方は無料です)。
大学・高専・高校などの教育機関での採用実績も多数あるロングセラー商品Study Cが、個人向けに無料提供を始めました。
インタープリタの手軽さに加え、ゲームや3Dタートルグラフィックで楽しく勉強したりと、C言語の学習を協力にサポートします。
ブロック崩しゲーム 3Dツリー クリスマスツリー
また、このようなボタンの用意されているページでは、掲載しているプログラムをStudy Cに直接ロードし実行したりすることができます。
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する
Study C無料利用についての詳細は、このページを参照してください。




■toupper
英大文字への変換

【分類】
文字関数

【書式】
int toupper(int c);

【パラメータの型と説明】

パラメータ説明
int c変換文字

【機能説明】
cが小文字のときは大文字に変換し、そのアスキーコードを返します。
cが小文字でないときはcを返します(有効な範囲内で)。
cは-1から255までの値が有効です。

Study Cを使用している場合は、下記のようにコマンドラインから実行(exprコマンドを使用)して動作を確認することができます。

C:\StudyC\MyProg>expr toupper('a');
<int>65 0x41

C:\StudyC\MyProg>expr toupper('z');
<int>90 0x5a

この例ではアスキーコードの値が表示されて、よくわからないと思います。 下記のようにputchar()関数を組み合わせれば結果の文字も確認することができます。 putchar()関数は出力した文字のアスキーコードを返すので、文字コードも一緒に確認することができます。

C:\StudyC\MyProg>expr putchar(toupper('a'));
A<int>65 0x41

C:\StudyC\MyProg>expr putchar(toupper('z'));
Z<int>90 0x5a

C:\StudyC\MyProg>expr putchar(toupper('A'));
A<int>65 0x41

※↑カーソルキーを押すと入力したコマンドが呼び出されるので文字を変更して試してみてください。

1番目は英小文字'a'が大文字'A'に変換されています。
2番目は英小文字'z'が大文字'Z'に変換されています。
3番目は英大文字'A'なので、そのまま'A'となります。

次に0から255の範囲外の値を指定してみます(有効な文字は表示されないのでputchar()関数は使用しません)。

C:\StudyC\MyProg>expr toupper(-1);
<int>-1 0xffffffff

C:\StudyC\MyProg>expr toupper(-2);
<int>254 0xfe

C:\StudyC\MyProg>expr toupper(1000);
<int>232 0xe8

1番目は-1(EOF)なのでそのまま-1が返されます。
この-1の扱いはgetchar()関数などが返す値をそのまま利用できるようにするためと考えられます。
2番目と3番目は範囲外の値なため不定な値が返されています。
この不定な値は、与えられた数と0xFFのandをとった結果と同じ値が返されています。

通常のコンパイラを使用する場合の使用例は下記になります(もちろんStudy CでもOKです)。

#include <stdio.h>

main()
{
        printf("%c\n", toupper('a'));
        printf("%c\n", toupper('z'));
        printf("%c\n", toupper('A'));
        printf("%d\n", toupper(-1));
        printf("%d\n", toupper(-2));
        printf("%d\n", toupper(1000));
}

実行結果は以下になります。

A
Z
A
-1
254
232

大文字から小文字への変換は以下のように簡単なプログラムで実現できます。

#include <stdio.h>

int     _toupper(int c)
{
        if (c >= 'a' && c <= 'z')
        {
                return c - 'a' + 'A';
        }
        return c;
}

main()
{
        printf("%c\n", _toupper('a'));
        printf("%c\n", _toupper('z'));
        printf("%c\n", _toupper('A'));
}

実行結果は以下になります。

A
Z
A

多くのコンパイラは、このような変換のため計算は行わず配列を用意して変換を行っています。

#include <stdio.h>

unsigned char
        uppperTable[256] = {
                0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
                0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
                0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
                0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
                ' ',  '!',  '"',  '#',  '$',  '%',  '&',  '\'',
                '(',  ')',  '*',  '+',  ',',  '-',  '.',  '/',
                '0',  '1',  '2',  '3',  '4',  '5',  '6',  '7',
                '8',  '9',  ':',  ';',  '<',  '=',  '>',  '?',
                '@',  'A',  'B',  'C',  'D',  'E',  'F',  'G',
                'H',  'I',  'J',  'K',  'L',  'M',  'N',  'O',
                'P',  'Q',  'R',  'S',  'T',  'U',  'V',  'W',
                'X',  'Y',  'Z',  '[',  '\\', ']',  '^',  '_',
                '`',  'A',  'B',  'C',  'D',  'E',  'F',  'G',
                'H',  'I',  'J',  'K',  'L',  'M',  'N',  'O',
                'P',  'Q',  'R',  'S',  'T',  'U',  'V',  'W',
                'X',  'Y',  'Z',  '{',  '|',  '}',  '~',  '?',
                /*** 0x80 以降は省略 ***/
        };

int     _toupper(int c)
{
        if (c == -1)
        {
                return -1;
        }
        if (islower(c))
        {
                return uppperTable[c];
        }
        return (unsigned char)c;
}

main()
{
        printf("%c\n", _toupper('a'));
        printf("%c\n", _toupper('z'));
        printf("%c\n", _toupper('A'));
}

実行結果は以下になります。

A
Z
A

このプログラムのように変換用の配列(uppperTable)を作成し、0番目の要素には0、1番目の要素には1といったように値をセットしておきます。 そして英大文字に該当する部分に英小文字をセットしておけば、uppperTable[c]の部分で変換をすることができます。

【参照関数】
tolower

【使用例】
C言語ケーススタディ フィルタ処理(大小文字変換)