strtod
strtod (string to double) とは、引数の文字列をC言語のdouble
型に変換する標準Cライブラリの関数である。ヘッダーファイル<stdlib.h>
に宣言されている。
形式
[編集]#include <stdlib.h>
double strtod(const char *nptr, char **endptr);
C99以降は以下のようなプロトタイプである。
double strtod(const char * restrict nptr, char ** restrict endptr);
機能
[編集]引数
[編集]第1引数nptr
の文字列では、+
もしくは-
の後に、以下のものを続けて書くことができる。
符号は省略することもできる。
また、INF
の代わりにINFINITY
と書くこともできる。
INF
はその前が+
ならば正の無限大に、-
ならば負の無限大になる。
文字列先頭に空白があった場合は無視される。
第2引数endptr
がNULL
でない場合、endptr
が指しているアドレスに変換終了位置へのポインタが保存される。
戻り値
[編集]変換が成功した場合、変換した値を返す。
変換に失敗した場合、0
を返す。
正しい値がオーバーフローを起こす場合、その値の符号に応じて正もしくは負のHUGE_VAL
を返し、errno
にERANGE
が代入される。
正しい値がアンダーフローを起こす場合、絶対値がdouble
型の中で最も小さく正規化された正の数DBL_MIN
以下であるような値(一般的な実装では0
)を返す。このときerrno
にERANGE
が代入されるかどうかは実装定義である[1]。
ロケール
[編集]strtod
の変換処理は、現在設定されているロケール (locale) の影響を受ける。そのため、小数点にピリオドを使う文化圏とコンマを使う文化圏とでは変換結果が変わることがあるため注意が必要である。例えばロケールがドイツ語-ドイツ (de-DE) やフランス語-フランス (fr-FR) に設定されている場合、"123.456"
という文字列をstrtod
で変換すると123
となり、"123,456"
という文字列をstrtod
で変換すると123.456
となる。
一部の処理系では、引数に追加のロケールオブジェクトを受け取るstrtod_l
関数または_strtod_l
関数が実装されており、現在のプロセスやスレッドに設定されているロケールに依存せず、引数で指定したロケールをもとに変換処理を実行することができる[2][3]。
strtof
[編集]C99以降は、戻り値がfloat
型で、オーバーフロー時には正または負のHUGE_VALF
を返すstrtof
も規定されている。
#include <stdlib.h>
float strtof(const char * restrict nptr, char ** restrict endptr);
strtold
[編集]C99以降は、戻り値がlong double
型で、オーバーフロー時には正または負のHUGE_VALL
を返すstrtold
も規定されている。
#include <stdlib.h>
long double strtold(const char * restrict nptr, char ** restrict endptr);
atof
[編集]同様の機能を持つ標準関数にatof
があるが、こちらはエラーが発生した場合の動作が規定されておらず、strtod
と比べて堅牢性に欠けるため、atof
を非推奨としているガイドラインもある[4][5]。