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 を戻します。

どちらの場合も、errnoERANGE に設定されます。nptr が指すストリングが 想定する形式でない場合、変換は行われません。 nptr の値は、endptrNULL ポインターでない場合に、 endptr が指すオブジェクトに保管されます。

数字以外の文字が、指数として読み取られる E または e に続く場合、strtod()strtof()、および strtold() 関数は 失敗しません。例えば、100elf は 浮動小数点値 100.0 に変換されます。

INFINITY (大/小文字を区別しない) の文字シーケンスは、INFINITY の値をもたらします。NAN の文字値は、Quiet Not-A-Number (NAN) 値をもたらします。

この例では、ストリングを double、浮動、および long double 値に変換します。 変換済みの値および変換を停止したサブストリングを出力します。
#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"

*/