サイトマップ / C言語講座>出入り口>総目次>目次:関数>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言語講座−それ自体コンパイルできる教材を使った講座です−