【C言語】数値を文字列に変換する方法【int/float → char*/char[]】

int型の整数値やdouble型の浮動小数点数を文字列化する方法を紹介します。

数値型から文字列型に変換する

snprintf関数の利用が適切です。同等の関数としてsprintf_sが利用できる場合もあります。

snprintf関数

第一引数に文字列のバッファ、第二引数にバッファのサイズを指定します。第三引数以降にはprintf関数と同等の書式文字列と各種実引数を指定します。

// #include <stdio.h>

int i = -99;

char buf[12];
snprintf(buf, 12, "%d", i);

puts(buf); // "-99"
double f = 3.141;
char buf[24];

snprintf(buf, 24, "%f", f);
puts(buf); // "3.141000"

snprintf(buf, 24, "%.2f", f);
puts(buf); // "3.14"

目次

スポンサーリンク

変換指定子

snprintfはprintf関数と同等の変換指定子が利用できるため、long型("%ld")やchar("%c")による変換も可能です。

型名変換指定子備考
char%c
int%d10進符号付き整数
unsigned int%u10進符号無し整数
unsigned int%o, %x8進数, 16進数 符号無し整数
long%ldlong型のサイズが64bitの場合
float%f
double%f%lfは不要

16進数・8進数の値を文字列に変換する方法

printf関数と同等のフォーマットが可能ですので、16進数・8進数表記による文字列化も行えます。

int i = 16;
char buf[20];

snprintf(buf, 20, "%#x", i);
puts(buf); // "0x10"(16進数)

snprintf(buf, 20, "%#o", i);
puts(buf); // "020" (8進数)

より具体的なフォーマット方法については以下のページが参考になります。

【C言語】2進数 8進数 16進数 形式で出力する方法【printf】

バッファのサイズについて

文字列の書き込み先となる配列(buf)のサイズは、数値の桁数に応じて適切な値を設定しておく必要があります。

// long型の符号付き最小値を考慮した変換
long l = LONG_MIN; // LONG_MIN  ==  -9223372036854775808
char buf[21];      // 21 == strlen("-9223372036854775808") + 1/* '\0' */
snprintf(buf, 21, "%ld", l);

// unsigned int型の最大値を考慮した変換
unsigned int i = UINT_MAX; // UINT_MAX  ==  4294967295
char buf[11];              // 11 == strlen("4294967295") + 1/* '\0' */
snprintf(buf, 11, "%u", i);

sprintf関数

今回利用した# snprintf関数の他に、sprintf関数も存在しますが、そちらはバッファオーバーフローの危険性があるため、現在ではsnprintfやsprintf_sの利用が推奨されています。

以下はsprintf関数の正常な利用例です。

int i = 89;
char buf[3];
sprintf(buf, "%d", i); // buf == {'8', '9', '\0'}

以下はバッファオーバーランが発生した危険な処理の例です。

int i = 123;
char buffer_overflow = 9, buf[3];
sprintf(buf, "%d", i); // buf == {'1', '2', '3'}
printf("%s, %d", buf, buffer_overflow == '\0'); // "123, 1"

buf配列に対して過剰に書き込まれた終端文字列'\0'buffer_overflow変数の値を上書きしてしまっていることが分かります。

itoa関数

itoa関数による同等の変換も可能ですが、itoa/_itoa関数は特定の環境でしか使えない非標準の関数です。移植性に問題があるため、利用はオススメはしません。同じことは# snprintf関数やsprintf関数でも実現できます。

char buf[3];
itoa(89, buf, 10); // buf == {'8', '9', '\0'}

広告