サイトマップ / C言語講座出入り口総目次目次:関数>16進文字列を10進数に変換

青い直線

16進文字列を10進数に変換

青い直線

[パスカルの三角形]←このソース→[構造体とは]

/* 今日は16進文字列を10進数に変換する関数を作ります。最初に今日学ぶ標準ライブラリ関数、tolower( )について簡単に説明します。

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

    例:tolower(c);

    実行結果    戻り値
    成功        英大文字であれば小文字

tolower( )はcが英大文字であれば小文字に変換して返します。そうでなければそのまま返します。

ソースプログラムの説明

それでは、10進数に変換する関数を作ります。この関数の名前は、ToDec( )とします。引数として、8桁までの16進文字列を取ることにします。引数をこの関数は書き換えてはいけないので、constを付けて宣言します。8桁までの16進数は、unsigned long型(4 バイト)で表せるので、戻り値は unsigned long型とします。

ToDec( )は16進文字列を先頭から1文字ずつ読みます。それが文字列の末尾のヌル文字(\0)でなければ、'0'から'9'の文字かどうか調べます。もしそうなら、下記の式によって数字に変換して、nに代入します。

    n = str[i] - '0';

'a'から'f'の文字か、'A'から'F'の文字なら、tolower( )で小文字に変換してから下記の式によって数字に変換して、nに代入します。

    n = c - 'a' + 10;

それ以外の文字なら、正常に変換できないのでプログラムを終了させます。文字列の次の文字を読む前に下記の式を実行します。

    x = x *16 + n;

この式は文字を1文字読み込むたびに、1度実行されます。nには文字を数字に変換した結果がしまってあるので、 文字列の先頭から順次実行することにより、文字列を10進数に変換します。 */

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

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

unsigned long ToDec(const char str[ ]);
void main(void);

  /* 16 進文字列を 10 進数に変換する */
unsigned long ToDec(const char str[ ])
{
    short i = 0;        /* 配列の添字として使用 */
    short n;
    unsigned long x = 0;
    char c;

    while (str[i] != '\0') {        /* 文字列の末尾でなければ */

            /* '0' から '9' の文字なら */
        if ('0' <= str[i] && str[i] <= '9')
            n = str[i] - '0';        /* 数字に変換 */

            /* 'a' から 'f' の文字なら */
        else if ('a' <= (c = tolower(str[i])) && c <= 'f')
            n = c - 'a' + 10;        /* 数字に変換 */

        else {        /* それ以外の文字なら */
            printf("無効な文字です。\n");
            exit(0);        /* プログラムを終了させる */
        }
        i++;        /* 次の文字を指す */

        x = x *16 + n;    /* 桁上がり */
    }
    return (x);
}


void main(void)
{
    int i;            /* 変換する16進文字列(16進文字列です) */
    char str[4][9] = {"BED", "CAFE", "BADFACE","DEADBEE"};

    for(i = 0; i < 4; i++)
        printf("0X%s = %lu\n", str[i], ToDec(str[i]));
}

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

[パスカルの三角形]←このソース→[構造体とは]

青い直線

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

青い直線

サイトマップ / C言語講座出入り口総目次目次:関数>16進文字列を10進数に変換