電脳ヨーグルト(技術ブログ)

勉強したことを淡々とメモしていきます

与えられた数字を10進、16進、2進の文字列に変換してchar配列に格納する関数

任意の数字を10進、16進、2進の文字列に変換してchar配列に格納する関数を作りました。

3つの関数は与えられら数字をそれぞれ10進数、16進数、2進数の文字列に変換します。

プログラムの中で+48や+55という数字が出てきますが、それは数字を文字列に変換するためのものです。
例えば数字の5を文字列の5として扱いたい場合は数字の5に48を足し、53とすればよいのです。

詳しくは以下のASCIIコード表みてください。
www9.plala.or.jp

#include <stdio.h>
#include <windows.h>
#define STR_LEN (30)
#define STORE_SIZE (16)

/* 関数宣言 */
BOOL MakeIntString(DWORD num, char * str, DWORD len);
BOOL MakeHexString(DWORD num, char * str);
BOOL MakeBinString(BYTE num, char * str);

/* 関数定義 */
BOOL MakeIntString(DWORD num, char * str, DWORD len) {
	//変数の定義
	//入力エラー処理
	DWORD sorce_num, str_len;
	if(str == NULL || len == 0){
	 printf("strがNULLもしくはlenが0(Ret = FALSE)\n");
	 return FALSE;
	}
	sorce_num = num;
	str_len = len;
	// 変換した文字をstrに格納
	while(str_len > 0) {
	 str_len--;
	 if (sorce_num != 0) {
	 // 数字から文字に変換 +48で整数が文字に変わる
		*(str + str_len) = (sorce_num % 10) + 48; //配列の一番右から順に一桁目の文字を入れていく
		sorce_num /= 10;
	 }
	 // 残りの桁を0埋め
	 else {
		*(str + str_len) = '0';
	 }
	}
	*(str + len) = '\0';
	//出力
	printf("MakeIntString(%d, str, %d) → ", num, len);
	if (sorce_num == 0) {
	 printf("str = %s(Ret=TRUE)\n", str);
	 return TRUE;
	}
	else {
	 printf("str = %s(Ret=FALS+E)\n", str);
	 return FALSE;
	}
}

/* 関数定義 */
BOOL MakeHexString(DWORD num, char * str) {
	//変数の定義
	DWORD sorce_num, str_len;
	int hex_part;
	sorce_num = num;
	str_len = STORE_SIZE;
	if(str == NULL){
		printf("strがNULL(Ret = FALSE)\n");
		goto label;
	}
	// 変換した文字をstrに格納
	while(str_len > 0) {
		str_len--;
		hex_part = sorce_num % 16;
		if (sorce_num != 0) {
		 if (hex_part >= 0 && hex_part <= 9){
			*(str + str_len) = hex_part + 48;
		 }
		 // 数字から文字に変換 +55で整数(1~9)が文字に変わる
		 else if(hex_part >= 10 && hex_part <= 15 ){
			*(str + str_len) = hex_part + 55;
		 }
		  // 配列の一番右から順に一桁目の文字を入れていく
		 sorce_num /= 16;
		}
		// 残りの桁を0埋め
		else {
		 *(str + str_len) = '0';
		}
	}

	*(str + STORE_SIZE) = '\0';
	//出力
	printf("MakeHexString(%d, str) → ", num);
	if (sorce_num == 0) {
		printf("str = %s(Ret=TRUE)\n", str);
		return TRUE;
	}
	else {
		printf("str = %s(Ret=FALS+E)\n", str);
		label:
		return FALSE;
	}
}


/* 関数定義 */
BOOL MakeBinString(BYTE num, char * str){
	//変数の定義
	DWORD sorce_num, str_len;
	int bin_part;
	sorce_num = num;
	str_len = STORE_SIZE;
	if(str == NULL){
		printf("strがNULL(Ret = FALSE)\n");
		goto label;
	}

	// 変換した文字をstrに格納
	while(str_len > 0) {
		str_len--;
		bin_part = sorce_num % 2;
		if (sorce_num != 0) {
		  *(str + str_len) = bin_part + 48;
			// 配列の一番右から順に一桁目の文字を入れていく
			sorce_num /= 2;
		}
		// 残りの桁を0埋め
		else {
			*(str + str_len) = '0';
		}
	}
	*(str + STORE_SIZE) = '\0';
	//出力
	printf("MakeBinString(%d, str) → ", num);
	if (sorce_num == 0) {
		printf("str = %s(Ret=TRUE)\n", str);
		return TRUE;
	}
	else {
		printf("str = %s(Ret=FALS+E)\n", str);
		label:
		return FALSE;
	}
}

void main() {
       // 変換する数字の値は任意
	DWORD i = 123456;
	DWORD len = 10;
	// 変換後の文字列を格納するための配列
	char str1[STR_LEN] = { '\0' };
	char str2[STR_LEN] = { '\0' };
	char str3[STR_LEN] = { '\0' };
	// 数字を10進の文字列に変換
	MakeIntString(i, str1, len);
	// 数字を16進の文字列に変換
	MakeHexString(200, str2);
	// 数字を2進の文字列に変換
	MakeBinString(10, str3);
}