C言語 数値↔文字列 変換ツール
C言語の主要な変換関数(atoi、strtol、sprintf、snprintf、sscanf など)を使ったとき、実際にどのような結果が得られるかをブラウザ上でシミュレートできるツールです。整数・浮動小数点数・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言語の printf・sprintf・scanf・sscanf などで使用される書式指定子の一覧です。適切な書式指定子を使用することで、様々な型の数値と文字列を正確に変換できます。
| 書式指定子 | データ型 | 説明 | 例(値: 255) |
|---|---|---|---|
%d | int | 10進整数(符号付き) | “255” |
%i | int | 10進整数(scanf時は基数自動判定) | “255” |
%u | unsigned int | 10進整数(符号なし) | “255” |
%o | unsigned int | 8進数表記 | “377” |
%x | unsigned int | 16進数表記(小文字) | “ff” |
%X | unsigned int | 16進数表記(大文字) | “FF” |
%f | double | 固定小数点表記(デフォルト: 小数6桁) | “255.000000” |
%e | double | 科学的記数法(小文字e) | “2.550000e+02” |
%E | double | 科学的記数法(大文字E) | “2.550000E+02” |
%g | double | %fと%eの短い方を自動選択 | “255” |
%G | double | %fと%Eの短い方を自動選択 | “255” |
%c | char | 文字1文字 | — |
%s | char* | 文字列 | — |
%p | void* | ポインタアドレス(16進) | — |
%ld | long | long型整数(10進) | — |
%lld | long long | long long型整数(C99以降) | — |
%lf | double (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() は endptr と errno を使ってオーバーフローや不正入力を検出できます。JPCERT/CCも atoi 系関数の使用を非推奨としています。
よく使う変換パターン一覧
| 変換の目的 | 推奨関数 | コード例 |
|---|---|---|
| 文字列 → int(簡易) | atoi() | int n = atoi("123"); |
| 文字列 → int(安全) | strtol() | long n = strtol("123", &end, 10); |
| 文字列 → double | strtod() | double d = strtod("3.14", &end); |
| 文字列 → 16進int | strtol() | long n = strtol("FF", &end, 16); |
| 文字列 → 2進int | strtol() | 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 を返します。
