strtod, _strtod_l, wcstod, _wcstod_l

文字列を倍精度値に変換します。

構文

double strtod(
   const char *strSource,
   char **endptr
);
double _strtod_l(
   const char *strSource,
   char **endptr,
   _locale_t locale
);
double wcstod(
   const wchar_t *strSource,
   wchar_t **endptr
);
double _wcstod_l(
   const wchar_t *strSource,
   wchar_t **endptr,
   _locale_t locale
);

パラメーター

strSource
NULL で終わる変換対象の文字列。

endptr
スキャンの終了位置を示す文字へのポインター。

locale
使用するロケール。

戻り値

strtod では、オーバーフローを引き起こす場合を除き、浮動小数点数の値を返します。オーバーフローの場合は、この関数で +/-HUGE_VAL を返します。 符号 HUGE_VAL は、表現できない値の符号と一致します。 変換を実行できない場合、またはアンダーフローが発生する場合、strtod では 0 を返します。

wcstod では、strtod に似た値を返します。

  • 両方の関数とも、オーバーフローまたはアンダーフローが発生した場合、errnoERANGE に設定されます。
  • 無効なパラメーターがある場合は、errnoパラメーターの検証で説明されているように、無効なパラメーター ハンドラーが設定EINVALされ、無効なパラメーター ハンドラーが呼び出されます。

このリターン コードおよびその他のリターン コードの詳細については、「errno_doserrno_sys_errlist_sys_nerr」を参照してください。

解説

各関数は、入力文字列 strSourcedouble に変換します。 strtod 関数は strSource を倍精度値に変換します。 strtod では、数値の一部として認識できない文字を最初に見つけた時点で、文字列 strSource の読み取りを停止します。 この文字は、終端の NULL 文字の場合があります。 wcstod 関数は、strtod 関数のワイド文字バージョンで、strSource 引数はワイド文字列です。 それ以外では、これらの関数の動作は同じです。

既定では、この関数のグローバル状態の適用対象は、アプリケーションになります。 この動作を変更するには、「CRT のグローバル状態」を参照してください

汎用テキスト ルーチンのマップ

TCHAR.H ルーチン _UNICODE_MBCS が定義されていない _MBCS が定義されている _UNICODE が定義されている
_tcstod strtod strtod wcstod
_tcstod_l _strtod_l _strtod_l _wcstod_l

LC_NUMERIC現在のロケールのカテゴリ設定によって、基数ポイント文字strSourceの認識が決定されます。 詳細については、setlocaleを参照してください。 _l サフィックスが付いていない関数では、現在のロケールを使用します。_strtod_l は、渡された locale を代わりに使用する点を除いて _strtod と同じです。 詳細については、「 Locale」を参照してください。

endptrNULL 以外の場合は、スキャンを停止させた文字へのポインターを endptr が指す位置に格納します。 変換できなかった場合 (有効な数字が見つからなかった場合、または無効な base を指定した場合) は、strSource の値を endptr が指す位置に格納します。

strtod は、 strSource 次のいずれかの形式の文字列を指す必要があります。

[whitespace] [sign] {digits [radixdigits] | radixdigits}[{e | E} [sign] digits]
[whitespace] [sign] {0x | 0X} {hexdigits [radixhexdigits] | radixhexdigits}[{p | P} [sign] digits]
[whitespace] [sign] {INF | INFINITY}
[whitespace] [sign] NAN [sequence]

省略可能な先頭 whitespace は、空白文字とタブ文字で構成できます。これは無視されます。
sign はプラス (+) またはマイナス (-) のいずれかです。
digits は、1 個以上の 10 進数です。
hexdigits は 1 桁以上の 16 進数です。
radix は基数ポイント文字で、既定の "C" ロケールのピリオド (.) か、現在のロケールが異なる場合、または指定された場合 locale はロケール固有の値です。
A sequence は、英数字またはアンダースコア文字のシーケンスです。

小数点文字の前に数字がない場合は、10 進数と 16 進数の両方の形式で、少なくとも 1 つの数字が小数点文字の後に必要です。

10 進形式では、10 進数の後に指数を付けることができます。指数部は、最初の文字 (e または E) と必要に応じて符号付き整数で構成されます。

16 進数の形式では、16 進数の後に指数を付けることができます。指数は、最初の文字 (p または P) と、指数を 2 の累乗として表す符号付き 10 進整数で構成されます。

どちらの形式でも、指数部または小数点文字がない場合、小数点文字は文字列の最後の数字の後に続くと見なされます。

大文字と小文字の区別は、フォームとNANフォームのINF両方で無視されます。 これらのいずれの形式にも一致しない文字が最初に見つかった時点で、スキャンは停止されます。

これらの関数の UCRT バージョンでは、Fortran スタイル (d または D) 指数の文字の変換をサポートしていません。 この非標準の拡張機能は、CRT の以前のバージョンでサポートされており、コードの互換性に影響する変更点がある可能性があります。 UCRT バージョンでは、16 進文字列と、INF および NAN 値のラウンドトリップがサポートされています。これは、以前のバージョンではサポートされていませんでした。 このサポートにより、コードの破壊的変更が発生する可能性もあります。 たとえば、文字列 "0x1a" は、strtod によって以前のバージョンでは 0.0 として解釈されますが、UCRT バージョンでは 26.0 として解釈されます。

必要条件

ルーチンによって返される値 必須ヘッダー
strtod, _strtod_l C: <stdlib.h> C++: <cstdlib> または <stdlib.h>
wcstod, _wcstod_l C: <stdlib.h> または <wchar.h> C++: <cstdlib><stdlib.h>、または <wchar.h>

互換性の詳細については、「 Compatibility」を参照してください。

// crt_strtod.c
// This program uses strtod to convert a
// string to a double-precision value; strtol to
// convert a string to long integer values; and strtoul
// to convert a string to unsigned long-integer values.
//

#include <stdlib.h>
#include <stdio.h>

int main(void)
{
    char *string, *stopstring;
    double x;
    long   l;
    int    base;
    unsigned long ul;

    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 = "-10110134932This stopped it";
    l = strtol(string, &stopstring, 10);
    printf("string = %s\n", string);
    printf("   strtol = %ld\n", l);
    printf("   Stopped scan at: %s\n\n", stopstring);

    string = "10110134932";
    printf("string = %s\n", string);

    // Convert string using base 2, 4, and 8:
    for (base = 2; base <= 8; base *= 2)
    {
        // Convert the string:
        ul = strtoul(string, &stopstring, base);
        printf("   strtol = %ld (base %d)\n", ul, base);
        printf("   Stopped scan at: %s\n", stopstring);
    }

    // NaN
    x = strtod("+nan", &stopstring);
    printf("\n%f\n", x);

    // INF
    x = strtod("-INF", &stopstring);
    printf("\n%f\n", x);

    // e - exponent
    x = strtod("1.18973e+49", &stopstring);
    printf("\n%f\n", x);

    // doesn't handle Fortran style
    x = strtod("1.18973d+49", &stopstring);
    printf("\n%f\n", x);
    printf("No Fortran style support. Stopped parsing at %s\n", stopstring);
}
string = 3.1415926This stopped it
   strtod = 3.141593
   Stopped scan at: This stopped it

string = -10110134932This stopped it
   strtol = -2147483648
   Stopped scan at: This stopped it

string = 10110134932
   strtol = 45 (base 2)
   Stopped scan at: 34932
   strtol = 4423 (base 4)
   Stopped scan at: 4932
   strtol = 2134108 (base 8)
   Stopped scan at: 932

nan

-inf

11897299999999999421285862642874618947301378359296.000000

1.189730
No Fortran style support. Stopped parsing at d+49

関連項目

データ変換
数学と浮動小数点のサポート
マルチバイト文字シーケンスの解釈
ロケール
文字列から数値の関数
strtol, wcstol, _strtol_l, _wcstol_l
strtoul, _strtoul_l, wcstoul, _wcstoul_l
atof, _atof_l, _wtof, _wtof_l
localeconv
_create_locale, _wcreate_locale
_free_locale