arrow 若葉プログラミング塾 > 知識の玉手箱 > C関数リファレンス >
strtod()
strtod()

この関数の目的

strtod()は、実数を表した文字列を double 型に変換する。

定義

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

働き

この関数は、 nptr が指す文字列の最初の部分を double での表記に変換する。 まず、入力文字列を3つに分ける。最初の、省略可能な空白(isspace()で識別される)の連続と、 変換の対象となる浮動小数点定数の形をした部分(この部分を以後「主体」と呼ぶ)と、最後にあるヌル文字を含む認識されない文字列にである。 次に、主体となる部分を浮動小数点数に変換し、結果を返す。

変換可能な主体の形は次のとおりである。 省略可能な正か負の符号と、それに続く数字の連なり(小数点を含めることができる)と、省略可能な指数部( eX の形で)である。 前述の主体が取るべき形は、空白以外の文字で始まる入力内で最長の部分文字列として定義される。 入力文字列の中身が無いとか、空白ばかりであるとか、最初の空白でない文字が符号や数字や小数点でない場合には、主体はない。

主体が変換可能であれば、最初の数字か小数点から後は、以下の点を除いて浮動小数点定数と同じように解釈される。 すなわち、小数点はピリオドとして扱われ、小数点も指数部も無い場合には数字の最後の桁の後に小数点があるものとして扱われる。 主体が負の符号で始まる場合、変換後の数値は負になる。 endptrNULL でなければ、最後の文字列へのポインタが endptr が指すオブジェクトに格納される。

"C"ロケール以外では処理系定義の主体の形が追加対応されていてもよい。

主体がない場合や変換可能でない場合は変換は行われず、 endptrNULL でなければ、 nptr の値が endptr が指すオブジェクトに格納される。

返り値は、存在するならば変換された値である。変換できなかった場合、ゼロが返る。 本来の数値が表現可能な範囲を超えていた場合、正か負の(値の符号による) HUGE_VAL が返り、 errno には ERANGE が格納される。 アンダーフローを起こした場合は、ゼロが返り errno には ERANGE が格納される。

解説

この関数の仕様はプログラマが読んでも疲れるだけである。これの完全な理解が必要なのはコンパイラの製作者ぐらいのものだろうと思われる。 その場合は原文の規格書を取り寄せた方がよかろう。

endptr にポインタのアドレスを渡してやれば解析が終わった直後の文字へのポインタを入れてくれる、 ということぐらいは知っておくに値するかもしれない。

arrow 若葉プログラミング塾 > 知識の玉手箱 > C関数リファレンス >
KC