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 kERANGE
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
_doserrno
errno
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é endptr
odkazuje . 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é endptr
odkazuje .
strtod
strSource
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
] {0x
sign
0X
| } {hexdigits
[radix
hexdigits
] | } radix
hexdigits
[{p
| P
} [sign
] digits
]
[] [whitespace
] {INF
sign
| INFINITY
}
[] [whitespace
] [sequence
sign
] 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