Sdílet prostřednictvím


strtod, _strtod_l, , wcstod_wcstod_l

Převede řetězce na hodnotu s dvojitou přesností.

Syntaxe

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
);

Parametry

strSource
Řetězec ukončený hodnotou null, který se má převést.

endptr
Ukazatel na znak, který zastaví prohledávání.

locale
Národní prostředí, které se má použít

Vrácená hodnota

strtod vrátí hodnotu čísla s plovoucí desetinou čárkou, s výjimkou případů, kdy reprezentace způsobí přetečení, v takovém případě vrátí funkce +/-HUGE_VAL. Znaménko odpovídá znaménku HUGE_VAL hodnoty, kterou nelze reprezentovat. strtod vrátí 0 , pokud nelze provést žádný převod nebo dojde k podtečení.

wcstod vrátí hodnoty analogicky k strtod:

  • U obou funkcí je nastaveno, errno jestli dojde k ERANGE přetečení nebo podtečení.
  • Pokud jsou neplatné parametry, errno nastaví EINVAL se a vyvolá se neplatná obslužná rutina parametru, jak je popsáno v ověření parametru.

Další informace o těchto a dalších návratových kódech naleznete v tématu , , , a_sys_nerr . _sys_errlist_doserrnoerrno

Poznámky

Každá funkce převede vstupní řetězec strSource na .double Funkce strtod se strSource převede na hodnotu s dvojitou přesností. strtod přestane číst řetězec strSource na prvním znaku, který nedokáže rozpoznat jako součást čísla. Tento znak může být ukončovací znak null. wcstod je širokoznační verze strtod; jeho strSource argument je řetězec širokého znaku. Tyto funkce se chovají stejně jinak.

Ve výchozím nastavení je globální stav této funkce vymezen na aplikaci. Chcete-li toto chování změnit, přečtěte si téma Globální stav v CRT.

Mapování rutin obecného textu

TCHAR.H rutina _UNICODE a _MBCS není definován _MBCS definovaný _UNICODE definovaný
_tcstod strtod strtod wcstod
_tcstod_l _strtod_l _strtod_l _wcstod_l

Nastavení LC_NUMERIC kategorie aktuálního národního prostředí určuje rozpoznávání znaku radixového bodu v strSource. Další informace najdete na webu setlocale. Funkce bez přípony _l používají aktuální národní prostředí; _strtod_l je shodné s _strtod výjimkou předchozího použití locale předaného. Další informace naleznete v tématu Národní prostředí.

Pokud endptr není NULL, ukazatel na znak, který zastavil kontrolu, je uložen v umístění, na které endptrodkazuje . Pokud nelze provést žádný převod (nebyly nalezeny žádné platné číslice nebo byla zadána neplatná základna), hodnota strSource je uložena v umístění, na které endptrodkazuje .

strtodstrSource očekává, že odkazuje na řetězec jednoho z následujících formulářů:

[] [whitespace] {digits [radix digits] | radix digits}sign [{e | E} [sign] digits]
[] [whitespace] {0xsign0X | } {hexdigits [radix hexdigits] | } radix hexdigits [{p | P} [sign] digits]
[] [whitespace] {INFsign | INFINITY}
[] [whitespace] [sequencesign] NAN

Volitelné úvodní whitespace znaky mohou obsahovat mezery a znaky tabulátoru, které jsou ignorovány.
sign je plus (+) nebo minus (-).
digits jsou jedno nebo více desetinných číslic.
hexdigits jsou jedna nebo více šestnáctkových číslic.
radix je znak radixového bodu, buď tečka (.) ve výchozím národním prostředí "C", nebo hodnota specifická pro národní prostředí, pokud je aktuální národní prostředí jiné nebo je locale zadáno.
A sequence je posloupnost alfanumerických znaků nebo podtržítka.

Pokud se v desítkovém i šestnáctkovém číselném formuláři nezobrazí žádné číslice před znakem paprskového bodu, musí se za znakem paprskového bodu objevit alespoň jedna číslice.

V desítkové podobě mohou být desetinné číslice následované exponentem, který se skládá z úvodního písmena (e nebo E) a volitelného znaménka celého čísla.

V šestnáctkové podobě mohou být šestnáctkové číslice následované exponentem, který se skládá z úvodního písmena (p nebo P) a volitelně podepsané desetinné číslo, které představuje exponent jako mocninu 2.

V obou formách platí, že pokud není exponentní část nebo znak paprskového bodu, předpokládá se, že znak paprskového bodu následuje za poslední číslicí v řetězci.

Velká a malá písmena se ignorují ve formulářích INF i NAN ve formulářích. První znak, který se nevejde do jednoho z těchto formulářů, zastaví prohledávání.

Verze těchto funkcí UCRT nepodporují převod fortran-style (d nebo D) exponentních písmen. Toto nestandardní rozšíření bylo podporováno dřívějšími verzemi CRT a může se jednat o zásadní změnu kódu. Verze UCRT podporují šestnáctkové řetězce a zaokrouhlování INF a NAN hodnoty, které nebyly v dřívějších verzích podporovány. Tato podpora může také způsobit zásadní změny v kódu. Například řetězec "0x1a" by byl interpretován strtod jako 0.0 v předchozích verzích, ale jako 26.0 ve verzi UCRT.

Požadavky

Rutina Požadovaný hlavičkový soubor
strtod, _strtod_l C: <stdlib.h> C++: <cstdlib> nebo <stdlib.h>
wcstod, _wcstod_l C: <stdlib.h> nebo <wchar.h> C++: <cstdlib>, <stdlib.h>nebo <wchar.h>

Další informace o kompatibilitě najdete v tématu Kompatibilita.

Příklad

// 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

Viz také

Konverze dat
Podpora pro matematiku a plovoucí desetinou čárku
Interpretace vícebajtových sekvencí znaků
Národní prostředí
Funkce řetězcových k číselným hodnotám
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