C言語 数値↔文字列変換ツール+関数一覧・サンプルコード

C言語 数値↔文字列 変換ツール

C言語の主要な変換関数(atoistrtolsprintfsnprintfsscanf など)を使ったとき、実際にどのような結果が得られるかをブラウザ上でシミュレートできるツールです。整数・浮動小数点数・16進数・8進数など多彩な形式に対応しています。

⚡ クイック変換

文字列 → 整数(atoi / strtol / sscanf)

整数 → 文字列(sprintf / snprintf)

文字列 → 浮動小数点数(atof / strtod / strtof)

進数変換(10進 ⇔ 16進 / 8進 / 2進)

カスタム書式(snprintf シミュレーター)

書式文字列の構文: %[フラグ][幅][.精度]変換指定子
フラグ: -(左詰め)+(符号)0(ゼロ埋め)スペース
変換指定子: d u f e g x X o
🕐 変換履歴(直近5件)

まだ変換履歴はありません。

C言語 変換関数一覧

C言語標準ライブラリには、数値と文字列を相互変換するための関数が多数用意されています。用途に応じて適切な関数を選択することが、安全で正確なプログラミングにつながります。

文字列 → 数値(変換関数)

関数名 ヘッダ 戻り値の型 説明 エラー検出
atoi()<stdlib.h>int文字列をint型整数に変換。先頭の空白を無視不可(非推奨)
atol()<stdlib.h>long文字列をlong型整数に変換不可(非推奨)
atoll()<stdlib.h>long long文字列をlong long型整数に変換(C99以降)不可(非推奨)
atof()<stdlib.h>double文字列をdouble型浮動小数点数に変換不可(非推奨)
strtol()<stdlib.h>long文字列をlong型に変換。基数指定・エラー検出対応可(推奨)
strtoul()<stdlib.h>unsigned long文字列をunsigned long型に変換可(推奨)
strtoll()<stdlib.h>long long文字列をlong long型に変換(C99以降)可(推奨)
strtod()<stdlib.h>double文字列をdouble型に変換。エラー検出対応可(推奨)
strtof()<stdlib.h>float文字列をfloat型に変換(C99以降)可(推奨)
strtold()<stdlib.h>long double文字列をlong double型に変換(C99以降)可(推奨)
sscanf()<stdio.h>int書式指定で文字列から複数の値を読み取り戻り値で確認可

数値 → 文字列(変換関数)

関数名 ヘッダ 説明 バッファオーバーフロー対策
sprintf()<stdio.h>書式指定で文字列に出力。printfの出力先を文字列に変更した版なし(非推奨)
snprintf()<stdio.h>最大書き込み文字数を指定可能な安全版sprintfあり(推奨)
itoa()非標準int型を文字列に変換。MSVC等で使用可能だが移植性なしなし(非標準)

printf / scanf 書式指定子一覧

C言語の printfsprintfscanfsscanf などで使用される書式指定子の一覧です。適切な書式指定子を使用することで、様々な型の数値と文字列を正確に変換できます。

書式指定子 データ型 説明 例(値: 255)
%dint10進整数(符号付き)“255”
%iint10進整数(scanf時は基数自動判定)“255”
%uunsigned int10進整数(符号なし)“255”
%ounsigned int8進数表記“377”
%xunsigned int16進数表記(小文字)“ff”
%Xunsigned int16進数表記(大文字)“FF”
%fdouble固定小数点表記(デフォルト: 小数6桁)“255.000000”
%edouble科学的記数法(小文字e)“2.550000e+02”
%Edouble科学的記数法(大文字E)“2.550000E+02”
%gdouble%fと%eの短い方を自動選択“255”
%Gdouble%fと%Eの短い方を自動選択“255”
%cchar文字1文字
%schar*文字列
%pvoid*ポインタアドレス(16進)
%ldlonglong型整数(10進)
%lldlong longlong long型整数(C99以降)
%lfdouble (scanf用)scanf時のdouble型読み取り
%%%文字そのものを出力“%”

変換サンプルコード

実際のC言語プログラムでの使用例をまとめています。コピーしてそのままコンパイル・実行できます。

文字列 → 整数(atoi と strtol)

#include <stdio.h> #include <stdlib.h> int main(void) { /* atoi: シンプルな変換(エラー検出なし) */ const char *str1 = “12345”; int num1 = atoi(str1); printf(“atoi結果: %d\n”, num1); /* 出力: 12345 */ /* strtol: エラー検出あり(推奨) */ const char *str2 = “0xFF”; char *endptr; long num2 = strtol(str2, &endptr, 0); /* 基数0=自動判定 */ printf(“strtol結果: %ld\n”, num2); /* 出力: 255 */ return 0; }

整数 → 文字列(sprintf と snprintf)

#include <stdio.h> int main(void) { int num = 255; char buf[32]; /* 10進数で文字列化 */ snprintf(buf, sizeof(buf), “%d”, num); printf(“10進: %s\n”, buf); /* 出力: 255 */ /* 16進数で文字列化 */ snprintf(buf, sizeof(buf), “%x”, num); printf(“16進: %s\n”, buf); /* 出力: ff */ /* ゼロ埋め8桁の16進数 */ snprintf(buf, sizeof(buf), “%08x”, num); printf(“16進8桁: %s\n”, buf); /* 出力: 000000ff */ return 0; }

文字列 → 浮動小数点数(atof と strtod)

#include <stdio.h> #include <stdlib.h> #include <errno.h> int main(void) { /* atof: シンプルな変換 */ double d1 = atof(“3.14159”); printf(“atof: %.5f\n”, d1); /* 出力: 3.14159 */ /* strtod: エラー検出対応(推奨) */ char *end; double d2 = strtod(“1.5e3”, &end); printf(“strtod: %g\n”, d2); /* 出力: 1500 */ return 0; }

sscanf による文字列からの値読み取り

#include <stdio.h> int main(void) { const char *input = “年齢:25 体重:68.5”; int age; double weight; /* sscanfで複数の値を同時に読み取り */ int count = sscanf(input, “年齢:%d 体重:%lf”, &age, &weight); printf(“読み取り数: %d\n”, count); /* 出力: 2 */ printf(“年齢: %d\n”, age); /* 出力: 25 */ printf(“体重: %.1f\n”, weight); /* 出力: 68.5 */ return 0; }

よく使う変換パターン

安全な文字列→整数変換の手順(strtol推奨)

なぜ strtol が atoi より安全なのか?
atoi() はエラーが発生しても返り値が0になるだけで、変換が成功したかどうかを判断できません。一方、strtol()endptrerrno を使ってオーバーフローや不正入力を検出できます。JPCERT/CCも atoi 系関数の使用を非推奨としています。

よく使う変換パターン一覧

変換の目的 推奨関数 コード例
文字列 → int(簡易)atoi()int n = atoi("123");
文字列 → int(安全)strtol()long n = strtol("123", &end, 10);
文字列 → doublestrtod()double d = strtod("3.14", &end);
文字列 → 16進intstrtol()long n = strtol("FF", &end, 16);
文字列 → 2進intstrtol()long n = strtol("1010", &end, 2);
int → 文字列snprintf()snprintf(buf, sizeof(buf), "%d", n);
int → 16進文字列snprintf()snprintf(buf, sizeof(buf), "%x", n);
double → 文字列snprintf()snprintf(buf, sizeof(buf), "%.2f", d);
文字列から複数値sscanf()sscanf(s, "%d %f", &i, &f);

よくある質問(FAQ)

atoi() と strtol() の違いは何ですか?
atoi() は変換に失敗した場合でも 0 を返すだけで、エラーを検出できません。また、オーバーフロー時の動作は未定義です。一方、strtol() は変換後のポインタ(endptr)と errno を確認することで、不正な文字の検出やオーバーフローの検出が可能です。セキュリティや堅牢性が求められる場面では strtol() の使用を推奨します。
sprintf() と snprintf() はどちらを使うべきですか?
snprintf() を使用することを強く推奨します。sprintf() はバッファのサイズを指定できないため、バッファオーバーフローの脆弱性につながる可能性があります。snprintf(buf, sizeof(buf), "%d", n) のように最大書き込み文字数を指定することで、安全に変換できます。
“123abc” を atoi() で変換するとどうなりますか?
atoi("123abc") は 123 を返します。先頭から数値として解釈できる部分だけを変換し、それ以降の文字は無視します。同様に strtol() でも 123 を返しますが、endptr が “abc” の先頭を指すため、変換が完全でなかったことを検出できます。
itoa() 関数はC標準ですか?
itoa() はC言語の標準関数ではありません。Microsoft Visual C++ などの環境では利用できますが、GCCや他のコンパイラでは使えない場合があります。移植性を考慮するなら、snprintf(buf, sizeof(buf), "%d", n) を代わりに使用してください。
浮動小数点数を文字列に変換するとき、精度はどう指定しますか?
書式指定子の「精度」部分で制御します。例えば snprintf(buf, sizeof(buf), "%.2f", 3.14159) とすると “3.14” が得られます。.2 は小数点以下2桁を意味します。%g 指定子では精度は有効桁数を表します(例: %.4g で4桁の有効数字)。
負の数値を文字列に変換するには?
通常の書式指定子(例: %d)を使えば、自動的にマイナス符号が付きます。例えば snprintf(buf, sizeof(buf), "%d", -42) の結果は “-42” になります。%+d を使うと正の数にも “+” が付きます(例: “+42″)。
strtol() の第3引数(基数)に0を指定するとどうなりますか?
基数に 0 を指定すると、文字列のプレフィックスに従って基数が自動判定されます。”0x” または “0X” で始まる場合は16進数、”0″ で始まる場合は8進数、それ以外は10進数として解釈されます。例えば strtol("0xFF", &end, 0) は 255 を返します。