コンテンツにスキップ

strtod

出典: フリー百科事典『ウィキペディア(Wikipedia)』

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引数endptrNULLでない場合、endptrが指しているアドレスに変換終了位置へのポインタが保存される。

戻り値

[編集]

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

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

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

正しい値がアンダーフローを起こす場合、絶対値がdouble型の中で最も小さく正規化された正の数DBL_MIN以下であるような値(一般的な実装では0)を返す。このときerrnoERANGEが代入されるかどうかは実装定義である[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]

脚注

[編集]

出典

[編集]

関連項目

[編集]

外部リンク

[編集]