strtod() - strtof() - strtold() — 文字ストリングから double、浮動、および long double への変換
フォーマット
#include <stdlib.h>
double strtod(const char *nptr, char **endptr);
float strtof(const char *nptr, char **endptr);
long double strtold(const char *nptr, char **endptr);
言語レベル
ANSI
スレッド・セーフ
はい
ロケール依存
これらの関数の振る舞いは、現行ロケールの LC_CTYPE カテゴリーおよび LC_NUMERIC カテゴリーの影響を受ける可能性があります。詳細については、CCSID およびロケールの理解を参照してください。
説明
strtod()、strtof()、および strtold() 関数は、文字ストリングを double、浮動、または long double の値に変換します。パラメーター nptr は、 数値バイナリー浮動小数点値として解釈できる文字のシーケンスを示します。 これらの関数によって、数値の一部として認識できないストリングは、 先頭文字のところで読み取りが停止されます。この文字は、ストリングの最後にある ヌル文字である場合もあります。
strtod()、strtof()、および strtold() 関数では、nptr が以下の形式でストリングを指すことを想定しています。
>>-+------------+--+-----+--------------------------------------> '-whitespace-' +- + -+ '- – -' >--+-+-digits--+---+--+--------+-+--+------------------------+-----------------+->< | | '-.-' '-digits-' | '-+-e-+--+-----+--digits-' | | '-.--digits-----------------' '-E-' +- + -+ | | '- – -' | '-0--+-x-+--+-hexdigits--+---+--+-----------+-+--+------------------------+-' '-X-' | '-.-' '-hexdigits-' | '-+-p-+--+-----+--digits-' '-.--hexdigits--------------------' '-P-' +- + -+ '- – -'
最初の文字がこの形式に適合しない場合、走査は停止されます。 さらに、INFINITY または NAN のシーケンス (大/小文字を区別しない) が許可されます。
指数が 16 進数字形式で指定された場合、その指数は 2 進 (底 2) 指数として解釈されます。指数が 10 進数字形式で指定された場合、その指数は 10 進 (底 10) 指数として解釈されます。
戻り値
strtod()、strtof()、および strtold() 関数は、 表現がアンダーフローまたはオーバーフローを引き起こす場合を除き、浮動小数点数の値を戻します。オーバーフローの場合、strtof() は HUGE_VALF または -HUGE_VALF を戻し、strtod() および strtold() は HUGE_VAL または -HUGE_VAL を戻します。アンダーフローの場合、すべての関数は 0 を戻します。
どちらの場合も、errno は ERANGE に設定されます。nptr が指すストリングが 想定する形式でない場合、変換は行われません。 nptr の値は、endptr が NULL ポインターでない場合に、 endptr が指すオブジェクトに保管されます。
数字以外の文字が、指数として読み取られる E または e に続く場合、strtod()、strtof()、および strtold() 関数は 失敗しません。例えば、100elf は 浮動小数点値 100.0 に変換されます。
INFINITY (大/小文字を区別しない) の文字シーケンスは、INFINITY の値をもたらします。NAN の文字値は、Quiet Not-A-Number (NAN) 値をもたらします。
例
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
char *string, *stopstring;
double x;
float f;
long double ld;
string = "3.1415926This stopped it";
f = strtof(string, &stopstring);
printf("string = ¥"%s¥"¥n", string);
printf(" strtof = %f\n", f);
printf(" Stopped scan at ¥"%s¥"¥n¥n", stopstring);
string = "100ergs";
f = strtof(string, &stopstring);
printf("string = ¥"%s¥"¥n", string);
printf(" strtof = %f\n", f);
printf(" Stopped scan at ¥"%s¥"¥n¥n", stopstring);
string = "3.1415926This stopped it";
x = strtod(string, &stopstring);
printf("string = ¥"%s¥"¥n", string);
printf(" strtod = %f¥n", x);
printf(" Stopped scan at ¥"%s¥"¥n¥n", stopstring);
string = "100ergs";
x = strtod(string, &stopstring);
printf("string = ¥"%s¥"¥n", string);
printf(" strtod = %f¥n", x);
printf(" Stopped scan at ¥"%s¥"¥n¥n", stopstring);
string = "3.1415926This stopped it";
ld = strtold(string, &stopstring);
printf("string = ¥"%s¥"¥n", string);
printf(" strtold = %lf¥n", ld);
printf(" Stopped scan at ¥"%s¥"¥n¥n", stopstring);
string = "100ergs";
ld = strtold(string, &stopstring);
printf("string = ¥"%s¥"¥n", string);
printf(" strtold = %lf¥n", ld);
printf(" Stopped scan at ¥"%s¥"¥n¥n", stopstring);
}
/***************** Output should be similar to: *****************
string = "3.1415926This stopped it"
strtof = 3.141593
Stopped scan at "This stopped it"
string = "100ergs"
strtof = 100.000000
Stopped scan at "ergs"
string = "3.1415926This stopped it"
strtod = 3.141593
Stopped scan at "This stopped it"
string = "100ergs"
strtod = 100.000000
Stopped scan at "ergs"
string = "3.1415926This stopped it"
strtold = 3.141593
Stopped scan at "This stopped it"
string = "100ergs"
strtold = 100.000000
Stopped scan at "ergs"
*/
関連情報
- atof() — 文字ストリングから浮動小数点への変換
- atoi() — 文字ストリングから整数への変換
- atol() - atoll() — 文字ストリングの long 型整数または long long 型整数への変換
- strtod32() - strtod64() - strtod128() — 文字ストリングから 10 進浮動小数点への変換
- strtol() - strtoll() — 文字ストリングから long 型および long long 型整数への変換
- strtoul() - strtoull() — 文字ストリングから符号なし long 型整数および符号なし long long 型整数への変換
- wcstod() - wcstof() - wcstold() — ワイド文字ストリングから double、浮動、および long double への変換
- wcstod32() - wcstod64() - wcstod128()— ワイド文字ストリングから 10 進浮動小数点への変換
- <stdlib.h >
