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、float、または long double 値に変換します。 パラメーター nptr は、 数値バイナリー浮動小数点値として解釈できる文字のシーケンスを示します。 これらの関数によって、数値の一部として認識できないストリングは、 先頭文字のところで読み取りが停止されます。 この文字は、ストリングの最後にある ヌル文字である場合もあります。

strtod()strtof()、および strtold() 関数は、 nptr が以下の形式のストリングを指すことを想定しています。

構文図を読むビジュアル構文図をスキップwhitespace +  – 数字.数字.数字eE +  – 数字0xX16 進数字.16 進数字.16 進数字pP +  – 数字

最初の文字がこの形式に適合しない場合、走査は停止されます。 さらに、以下のシーケンスがあります。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が指すオブジェクトに保管されます。

strtod()strtof()、および strtold() 関数は、指数として読み取られる E または e の後に数字以外の文字があっても失敗しません。 例えば、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"

*/

関連情報