strtod
形式
#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が指しているアドレスに変換終了位置へのポインタが保存される。
ロケール
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]。