strtod

文字列をdouble値に変換(エラー検出あり)

【書式】
#include <stdlib.h>
double strtod(const char *s, char **endptr);

【説明】
文字列 s を、double型に変換し返却します。このとき、文字列中に変換不可能 な文字があった場合には、その文字列のポインタをendptrに格納します。
atof関数は、単に文字列をdouble型に変換するのみで、文字列中に変換不可能な文字があった ときには対応できませんが、strtodを使うと、変換可能な部分についてはきちんと変換し、変換不可能な 部分についても情報を得ることができます。

【引数】
const char *s : 変換対象文字列。
書式は[空白類文字][符号+-][数値列][.][数値列][eまたはE[符号]数値列]。このとき、[]内は省略可能。
また、接尾語(F/f)は含まない。
(例)x = strtod(" -1.23e-3", NULL); printf("x=%g\n", x);
(結果)x=-0.00123

char **endptr : 変換不可能な文字列へのポインタの格納先。
(例)x = strtod("-1.23ABC", &e); printf("x=%g e=%s\n", x, e);
(結果)x=-1.23 e=ABC … "-1.23"を変換。"ABC"は変換不可能。

NULLの場合には、変換不可能な文字列への処理は行わない。
(例)x = strtod("-1.23ABC", NULL); printf("x=%g\n", x);
(結果)x=-1.23 … "-1.23"を変換。"ABC"は捨てる。


【戻り値】
成功時 : s の値をdoubleで返却。
失敗時 : 0
(例)x = strtod("ABC.EFG", &e); printf("x=%g e=%s\n", x, e);
(結果)x=0 e=ABC.EFG … "ABC.EFG"は変換できない。

※正しい値が表現可能な値の範囲外であるとき、値の符号に従って、正または負のHUGE_VALを返し、 errnoにはマクロERANGEの値を格納する。正しい値がアンダーフローを起こすときには0を返し、 errnoにはマクロERANGEの値を格納する。

【使用例】
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>	/* ERANGEを使用するために必要 */
#include <math.h>	/* HUGE_VALを使用するために必要 */

int main(void)
{
	char s[256], *e;
	double x;
	
	printf("変換する数値を入力してください。");
	scanf("%s", s);
	
	x = strtod(s, &e);
	
	if (errno != ERANGE) {
		printf("変換数値=%f\n", x);
		if (*e != '\0')
			printf("変換不可能部分=%s\n", e);
	}
	else if (x == HUGE_VAL)
		printf("double値で表現できる値を超えました。\n");
	
	return 0;
}
【実行結果例1】
変換する数値を入力してください。123.456789abcde
変換数値=123.456789
変換不可能部分=abcde

※緑字はキーボードからの入力

戻る


banner
初心者のためのポイント学習C言語」
Copyright(c) 2000-2004 TOMOJI All Rights Reserved