数値を文字列に変換 itoa

itoa は、stdlib.hをインクルードすれば、利用できます。
しかし正しく利用するには、その関数がどのように作られたものかを理解する必要があります。 以下では、この関数の定義例と利用例を紹介します。

コンピュータで、数値を表示させる場合は、文字の並びに変換する必要があります。
以下で、文字列に変換するitoa関数定義例を紹介します。

引数のポインタ変数を変更して作る定義例

引数valの数値を、radixの基数で、aの位置へ文字列として設定する関数です。
さまざまな作り方があるでしょうが、ここで紹介する定義例では具体的に次のように行っています。
例えば123の数値があるとし、基数が10の場合です。
下の桁からaの記憶域に変換します。
この例では、a[2]'3'を、 a[1]'2'を、a[0]'1'を、 記憶する必要があります。そのためには、10の基数から記憶に 必要な桁数(添え字)の2を求める必要があります。
それでまず、変換した文字の記憶に必要な桁数を求める繰り返しを行っています。
次に、下の桁から順番に文字へ変換する繰り返しを行っています。この例では次のように行います。
a[2] = 123 % 10 + '0';
a[1] = (123/10) % 10+ '0';
a[0] = (123/100) % 10+ '0';
このように、一桁の数値に'0'を加えることで、対応する文字コードに変換します。 なお、16進数のように、'9' を超える場合は、 アルファベットの'A'から順番に使えるよう、- 10 + 'A'を加算します。

#include <stdio.h>
char *itoa( int val, char *a, int radix )
{
	char *p = a;
	unsigned int v = val;/* 作業用(変換対象の値) */
	int n = 1;/* 変換文字列の桁数記憶用 */
	while(v >= radix){/* 桁数を求める */
		v /= radix;
		n++;
	}
	p = a + n; /* 最下位の位置から設定する */
	v = val;
	*p = '\0';/* 文字列終端の設定 */
	do {
		--p;
		*p = v % radix + '0';/* 1桁の数値を文字に変換 */
		if(*p > '9') {/* 変換した文字が10進で表現できない場合 */
			*p = v % radix - 10 + 'A'; /* アルファベットを使う */
		}
		v /= radix;
	} while ( p != a);
	return a;
}
main()
{
	char a[33];
	int v, r;
	printf("10進の数値入力>");
	scanf("%d",  & v);
	for(;;) {
		printf("基数入力>" , a );
		scanf("%d",  & r);
		if( r == 0 )  break;
		itoa(v, a, r);
		printf("変換した文字列 : %s\n", a );
	}
}

その実行例を以下に示します。

10進の数値入力>255
基数入力>10
変換した文字列 : 255
基数入力>2
変換した文字列 : 11111111
基数入力>8
変換した文字列 : 377
基数入力>16
変換した文字列 : ff
基数入力>0

この関数も、関数定義例からもわかるように、 変換した文字列が、引数で指定する配列の記憶範囲を超えるサイズであっても、 セットしようとします。
つまり、 利用する方で正しく(変換した文字列を記憶可能な大きさの配列で)使わなければならない関数といえます。

引数のポインタ変数を変更しないitoa定義例

上記itoaと同じ機能を行なわせる別の定義例を、以下に示します。
■■■■ の記述を正しく直して完成くだささい。
(なお、*のポインタ演算子を使わずに、[]の配列演算子を使ってください。つまり、添え字で位置を指定する形態です。 なお添え字変更は、後置インクリメントを使ってください)

←編集 入力後に クリックください。