Strtod

strtod (string to double) とは、引数の文字列をC言語の型に変換する標準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の文字列では、+もしくは-の後に、以下のものを続けて書くことができる。
10進数（指数表記も可能）
16進数（C99以降）
INF（C99以降）
NAN（C99以降）

符号は省略することもできる。

また、INFの代わりにINFINITYと書くこともできる。
INFはその前が+ならば正の無限大に、-ならば負の無限大になる。

文字列先頭に空白があった場合は無視される。

第2引数endptrがNULLでない場合、endptrが指しているアドレスに変換終了位置へのポインタが保存される。

 戻り値 
変換が成功した場合、変換した値を返す。

変換に失敗した場合、0を返す。

正しい値がオーバーフローを起こす場合、その値の符号に応じて正もしくは負のHUGE_VALを返し、errnoにERANGEが代入される。

正しい値がアンダーフローを起こす場合、絶対値が型の中で最も小さく正規化された正の数DBL_MIN以下であるような値（一般的な実装では0）を返す。このときerrnoにERANGEが代入されるかどうかは実装定義であるISO/IEC 9899:1999 / §7.20.1.3 The strtod, strtof, and strtold functions。

 ロケール 
strtodの変換処理は、現在設定されているロケール (locale) の影響を受ける。そのため、小数点にピリオドを使う文化圏とコンマを使う文化圏とでは変換結果が変わることがあるため注意が必要である。例えばロケールがドイツ語-ドイツ (de-DE) やフランス語-フランス (fr-FR) に設定されている場合、"123.456"という文字列をstrtodで変換すると123となり、"123,456"という文字列をstrtodで変換すると123.456となる。

一部の処理系では、引数に追加のロケールオブジェクトを受け取るstrtod_l関数または_strtod_l関数が実装されており、現在のプロセスやスレッドに設定されているロケールに依存せず、引数で指定したロケールをもとに変換処理を実行することができるMac OS X Manual Page For strtod_l(3)strtod, _strtod_l, wcstod, _wcstod_l | Microsoft Learn。

 strtof 
C99以降は、戻り値が型で、オーバーフロー時には正または負のHUGE_VALFを返すstrtofも規定されている。

#include <stdlib.h>
float strtof(const char * restrict nptr, char ** restrict endptr);

 strtold 
C99以降は、戻り値が型で、オーバーフロー時には正または負のHUGE_VALLを返すstrtoldも規定されている。

#include <stdlib.h>
long double strtold(const char * restrict nptr, char ** restrict endptr);

 atof 
同様の機能を持つ標準関数にatofがあるが、こちらはエラーが発生した場合の動作が規定されておらず、strtodと比べて堅牢性に欠けるため、atofを非推奨としているガイドラインもあるMSC24-C. 非推奨関数や時代遅れの関数を使用しないERR07-C. よりよいエラー検査を行える関数を使用する。

 脚注 

 出典 

 関連項目 
 C言語
 標準Cライブラリ
 atof

 外部リンク 
 strtof, strtod, strtold - cppreference.com
 strtod(3) - Linux man page
 strtod(3) | FreeBSD Manual Pages
 strtod, _strtod_l, wcstod, _wcstod_l | Microsoft Learn

Category:標準Cライブラリ