サイトマップ / C言語講座出入り口総目次目次:ポインタ>大文字小文字変換

青い直線

大文字小文字変換

青い直線

[特定の文字の現れる位置]←このソース→[変数の値を交換]

/* ソースプログラムの説明

標準ライブラリ関数に英小文字であれば大文字を、そうでなければその文字をそのまま返す関数と、英大文字であれば小文字を、そうでなければその文字をそのまま返す関数があります。下記を参照して下さい。

    #include <ctype.h>
    int toupper(int c);

    例:toupper(c);

    戻り値    c が英小文字であれば大文字、
             そうでなければcをそのまま返す

    #include <ctype.h>
    int tolower(int c);

    例:tolower(c);

    戻り値    c が英大文字であれば小文字、
             そうでなければcをそのまま返す

大文字と小文字についてはすでに文字列を比較で扱いました。今日は、文字列の各文字に対して同様の操作をする関数を作ります。関数は文字列へのポインタを引数にとり、文字列へのポインタを返します。

関数の名前はStrToLower( )とStrToUpper( )とします。関数の中で、作業用のchar型のポインタpを宣言します。引数として受け取った文字列へのポインタは、文字列の先頭アドレスを指しています。

for ( )ループの( )の中の最初にある初期化の式で、作業用ポインタに引数として受け取ったポインタを代入します。この操作により、作業用ポインタが文字列の先頭アドレスを指します。for ( ) ループの初期化の式は、ループに入る前にただ一回だけ実行されます。

StrToLower( )では、ポインタが指す中身(*p)をtolower( )へ渡します。

StrToUpper( )では、ポインタが指す中身(*p)をtoupper( )へ渡します。

これらの関数はその文字を受け取り、変換の後それを返すので、関数の戻り値を作業用のポインタpの中身に代入します。次いでpの指す位置を1進め、pの指す中身が'\0'なら、for ( ) ループから抜けて、受け取った文字列へのポインタを返して終了します。'\0'でなければ、上記の処理を続けます。

ソースプログラムで、for ( )ループの条件判断式が、単に'*p;'となっていますが、pの指す中身が'\0'なら偽になり、'\0'でなければ真になります。

あとはソースプログラム中のコメントを見て下さい。 */

/* ここからソースプログラム */

#include <stdio.h>
#include <ctype.h>    /* tolower(  )とtoupper(  )で必要 */

char *StrToLower(char *s);
char *StrToUpper(char *s);
void main(void);

  /* 文字列中の英大文字を小文字に変換 */
char *StrToLower(char *s)
{
    char *p;                     /* 作業用ポインタ */
                                 /* for (  )ループの初期化の式で、pは文字列の
                                    先頭アドレスを指すように初期化される */
    for (p = s; *p; p++)         /* pがヌルでなければ */
        *p = tolower(*p);        /* pの指す中身を小文字に変換 */
    return (s);                  /* 文字列の先頭アドレスを返す */
}

  /* 文字列中の英小文字を大文字に変換 */
char *StrToUpper(char *s)
{
    char *p;                     /* 作業用ポインタ */
                                 /* for (  )ループの初期化の式で、pは文字列の
                                    先頭アドレスを指すように初期化される */
    for (p = s; *p; p++)         /* pがヌルでなければ */
        *p = toupper(*p);        /* pの指す中身を大文字に変換 */
    return (s);                  /* 文字列の先頭アドレスを返す */
}

void main(void)
{
    char *str1 = "2 Book Shops";
    char *str2 = "3 Bus Stops";

    printf("str1: %s\n", str1);        /* 小文字に変換 */
    printf("StrToLower(str1): %s\n\n", StrToLower(str1));

    printf("str2: %s\n", str2);        /* 大文字に変換 */
    printf("StrToUpper(str2): %s\n", StrToUpper(str2));
}

/* ここまでソースプログラム */

/* 今回自作した関数は作業用のポインタで文字列を書き換え、受け取ったポインタはそのまま返す点に注目して下さい。

printf( )の引数に自作した関数を使っています。自作した関数は char型のポインタを返すので、 引数にポインタを要求するprintf( )の引数として使用できます。 */

[特定の文字の現れる位置]←このソース→[変数の値を交換]

青い直線

/* (C) 2000- YFプロ. All Rights Reserved. */    提供:C言語講座−それ自体コンパイルできる教材を使った講座です−

青い直線

サイトマップ / C言語講座出入り口総目次目次:ポインタ>大文字小文字変換