Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
atoi() / atof() / atol() / strtol()
文字列で表現された数値をプログラム内で使える数値型に変換する関数です。コマンドライン引数やファイルから読み込んだ文字列を数値として処理する際に使います。
構文
// 文字列を int に変換します。変換できない場合は 0 を返します。 int atoi(const char *str); // 文字列を double に変換します。 double atof(const char *str); // 文字列を long に変換します。 long atol(const char *str); // 文字列を long に変換します。変換できなかった位置のポインタと基数を指定できます。 // endptr: 変換終了位置のポインタ(不要なら NULL)。base: 基数(2〜36、0 で自動判定)。 long strtol(const char *str, char **endptr, int base); // 文字列を double に変換します(エラー検出対応版)。 double strtod(const char *str, char **endptr);
関数比較
| 関数 | 戻り値型 | エラー検出 | 基数指定 |
|---|---|---|---|
| atoi() | int | 不可(0 と区別できません) | 10進数のみ |
| atol() | long | 不可(0 と区別できません) | 10進数のみ |
| atof() | double | 不可(0.0 と区別できません) | 10進数のみ |
| strtol() | long | 可(endptr で確認) | 2〜36 または自動 |
| strtod() | double | 可(endptr で確認) | 10進数のみ |
サンプルコード
#include <stdio.h>
#include <stdlib.h>
int main(void) {
// atoi で文字列を int に変換します。
int n = atoi("42");
printf("atoi: %d\n", n); // 『atoi: 42』と出力されます。
// atof で文字列を double に変換します。
double d = atof("3.14");
printf("atof: %.2f\n", d); // 『atof: 3.14』と出力されます。
// strtol でエラーを検出しながら変換します。
char *end;
long val = strtol(" -123abc", &end, 10);
printf("strtol: %ld\n", val); // 『strtol: -123』と出力されます。
printf("残り: %s\n", end); // 『残り: abc』と出力されます。
// strtol で16進数文字列を変換します。
long hex_val = strtol("0xFF", NULL, 16);
printf("0xFF = %ld\n", hex_val); // 『0xFF = 255』と出力されます。
// strtol で基数 0 を指定すると "0x" を16進、"0" を8進と自動判定します。
long auto_val = strtol("0755", NULL, 0);
printf("0755(8進) = %ld\n", auto_val); // 『0755(8進) = 493』と出力されます。
// 変換失敗の検出方法です(atoi ではできません)。
char input[] = "abc";
end = input;
long result = strtol(input, &end, 10);
if (end == input) {
printf("変換失敗: 数値ではありません。\n"); // こちらが出力されます。
}
return 0;
}
概要
atoi() / atol() / atof() はエラー検出ができません。変換に失敗した場合も 0 や 0.0 を返すだけなので、入力が不正かどうかを判断できません。信頼性が必要な場面では『strtol()』や『strtod()』を使い、endptr で変換終了位置を確認してください。
オーバーフローが起きた場合、『strtol()』は LONG_MAX または LONG_MIN を返し『errno』に ERANGE をセットします。コマンドライン引数の変換など、外部からの入力を扱う場合は errno のチェックも行ってください。
逆方向(数値 → 文字列)の変換には『sprintf() / snprintf()』を使用してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。