K&R 演習2-3 解答 (プログラミング言語C 第2版)

スポンサーリンク

鍛錬 303

K&R 演習2-3 解答 (プログラミング言語C 第2版)

16進数の文字列(0x あるいは 0X が付いているものも含めて)をそれと同値な整数値へ変換する関数 htoi(s)を書け。許される文字は 0 から 9 と a から f および A から F である。

B.W.カーニハン D.M.リッチー 石田晴久 訳 『プログラミング言語C 第2版 ANSI 規格準拠』, (共立出版, 2017), pp.57.

スポンサーリンク

プログラム

以下は、16進数の文字列をそれと同値な整数値へ変換するプログラム、kr_2_3.c です。

// include
#include <stdio.h>

// prototype
int htoi(char s[]);

// main
int main(void)
{
	char s_1[256] = "123";
	char s_2[256] = "0x123";
	char s_3[256] = "0X123";
	char s_4[256] = "ab";
	char s_5[256] = "7FFFFFFF";
	int num;
	
	num = htoi(s_1);
	printf("(16進数,文字列) %s\n(10進数,整数値) %d\n", s_1, num);
	printf("\n");
	
	num = htoi(s_2);
	printf("(16進数,文字列) %s\n(10進数,整数値) %d\n", s_2, num);
	printf("\n");
	
	num = htoi(s_3);
	printf("(16進数,文字列) %s\n(10進数,整数値) %d\n", s_3, num);
	printf("\n");
	
	num = htoi(s_4);
	printf("(16進数,文字列) %s\n(10進数,整数値) %d\n", s_4, num);
	printf("\n");
	
	num = htoi(s_5);
	printf("(16進数,文字列) %s\n(10進数,整数値) %d\n", s_5, num);
	printf("\n");
	
	return 0;
}

// ====================================================
// @brief     16進数の文字列を10進数の整数値に変換する
// @param[in] s[]  変換する文字列(16進数)
// @return    num -> 変換後の整数値(10進数)
// @note      無し
// ====================================================
int htoi(char s[])
{
	int num;
	int i;
	
	// 文字列先頭が 0x または 0X の場合
	if (s[0] == '0') {
		if (s[1] == 'x' || s[1] == 'X')
			i = 2;
	}
	else
		i = 0;
	
	num = 0;
	for (; (s[i] >= '0' && s[i] <= '9')
				|| (s[i] >= 'A' && s[i] <= 'F')
				|| (s[i] >= 'a' && s[i] <= 'f'); ++i) {
		if (s[i] >= '0' && s[i] <= '9')
			num = 16 * num + (s[i] - '0');
		else if (s[i] >= 'A' && s[i] <= 'F')
			num = 16 * num + (s[i] - 'A' + 10);
		else if (s[i] >= 'a' && s[i] <= 'f')
			num = 16 * num + (s[i] - 'a' + 10);
	}
	
	return num;
}
スポンサーリンク

実行結果

以下は、プログラム kr_2_3.c を実行して、16進数の文字列を10進数の整数値に変換しています。

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra kr_2_3.c -o kr_2_3
***@ubuntu:~/***/test/c$ ./kr_2_3
(16進数,文字列) 123
(10進数,整数値) 291

(16進数,文字列) 0x123
(10進数,整数値) 291

(16進数,文字列) 0X123
(10進数,整数値) 291

(16進数,文字列) ab
(10進数,整数値) 171

(16進数,文字列) 7FFFFFFF
(10進数,整数値) 2147483647
タイトルとURLをコピーしました