strtod
, , _strtod_l
, , wcstod
_wcstod_l
Konwertuj ciągi na wartość o podwójnej precyzji.
Składnia
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
Ciąg zakończony wartością null do konwersji.
endptr
Wskaźnik do znaku, który zatrzymuje skanowanie.
locale
Ustawienia regionalne do użycia.
Wartość zwracana
strtod
Zwraca wartość liczby zmiennoprzecinkowej, z wyjątkiem sytuacji, gdy reprezentacja spowoduje przepełnienie, w tym przypadku funkcja zwraca wartość +/-HUGE_VAL
. Znak HUGE_VAL
odpowiada znakowi wartości, która nie może być reprezentowana. strtod
zwraca 0
wartość , jeśli nie można wykonać konwersji lub występuje niedopełnienie.
wcstod
zwraca wartości analogicznie do strtod
:
- Dla obu funkcji
errno
jest ustawiona wartośćERANGE
, jeśli występuje przepełnienie lub niedopełnienie. - Jeśli istnieją nieprawidłowe parametry,
errno
jest ustawiona naEINVAL
, a wywoływana jest nieprawidłowa procedura obsługi parametrów, zgodnie z opisem w temacie Walidacja parametru.
Aby uzyskać więcej informacji na temat tych i innych kodów powrotnych, zobacz errno
, _doserrno
, _sys_errlist
i _sys_nerr
.
Uwagi
Każda funkcja konwertuje ciąg strSource
wejściowy na double
wartość . Funkcja strtod
konwertuje strSource
na wartość o podwójnej precyzji. strtod
zatrzymuje odczytywanie ciągu strSource
przy pierwszym znaku, który nie może rozpoznać jako części liczby. Ten znak może być znakiem zerowym zakończenia. wcstod
jest wersją szerokoznakową ; strtod
jego strSource
argument jest ciągiem o szerokim znaku. Te funkcje zachowują się identycznie inaczej.
Domyślnie stan globalny tej funkcji jest zakresem aplikacji. Aby zmienić to zachowanie, zobacz Stan globalny w CRT.
Mapowania procedur tekstu ogólnego
TCHAR.H rutyna |
_UNICODE i _MBCS niezdefiniowane |
_MBCS zdefiniowany |
_UNICODE zdefiniowany |
---|---|---|---|
_tcstod |
strtod |
strtod |
wcstod |
_tcstod_l |
_strtod_l |
_strtod_l |
_wcstod_l |
Ustawienie LC_NUMERIC
kategorii bieżących ustawień regionalnych określa rozpoznawanie znaku punktu promienistego w elemencie strSource
. Aby uzyskać więcej informacji, zobacz setlocale
. Funkcje bez sufiksu _l
używają bieżących ustawień regionalnych; _strtod_l
są identyczne _strtod
z wyjątkiem poprzednich używa przekazanych locale
ustawień regionalnych. Aby uzyskać więcej informacji, zobacz Ustawienia regionalne.
Jeśli endptr
tak nie NULL
jest , wskaźnik do znaku, który zatrzymał skanowanie, jest przechowywany w lokalizacji wskazywanej przez endptr
. Jeśli nie można wykonać konwersji (nie znaleziono prawidłowych cyfr lub określono nieprawidłową bazę), wartość strSource
jest przechowywana w lokalizacji wskazywanej przez endptr
.
strtod
strSource
oczekuje wskazywania ciągu jednego z następujących formularzy:
[] [whitespace
] {digits
[radix
digits
] | radix
digits
}sign
[{e
| E
} [sign
] digits
]
[] [sign
] {0x
| 0X
} {hexdigits
[radix
hexdigits
] | radix
hexdigits
}whitespace
[{p
| P
} [sign
] digits
]
[] [whitespace
] {INF
| INFINITY
}sign
[] [whitespace
sign
] NAN
[] [sequence
]
Opcjonalne wiodące mogą whitespace
składać się z spacji i znaków tabulacji, które są ignorowane.
sign
jest plus (+) lub minus (-).
digits
to co najmniej jedna cyfra dziesiętna.
hexdigits
to co najmniej jedna cyfra szesnastkowa.
radix
jest znakiem punktu promieniowego , kropką (.) w domyślnych ustawieniach regionalnych "C" lub wartością specyficzną dla ustawień regionalnych, jeśli bieżące ustawienia regionalne są inne lub gdy locale
określono.
A sequence
to sekwencja znaków alfanumerycznych lub podkreślenia.
W obu postaciach liczb dziesiętnych i szesnastkowej, jeśli żadne cyfry nie są wyświetlane przed znakiem punktu promieniowego, co najmniej jeden musi pojawić się po znaku punktu promieniowego.
W postaci dziesiętnej cyfry dziesiętne mogą być następnie wykładnikiem, który składa się z litery wprowadzającej (e
lub E
) i opcjonalnie podpisanej liczby całkowitej.
W postaci szesnastkowej cyfry szesnastkowe mogą być następnie wykładnikiem, który składa się z litery wprowadzającej (p
lub P
) i opcjonalnie podpisanej liczby całkowitej dziesiętnej, która reprezentuje wykładnik jako moc 2.
W obu formach, jeśli nie ma części wykładniczej lub znaku punktu promieniowego, przyjmuje się, że znak punktu promienia jest obserwowany po ostatniej cyfrze w ciągu.
Wielkość liter jest ignorowana zarówno w formularzach, jak INF
i NAN
. Pierwszy znak, który nie pasuje do jednej z tych formularzy, zatrzymuje skanowanie.
Wersje UCRT tych funkcji nie obsługują konwersji liter wykładniczych typu Fortran (d
lub D
). To niestandardowe rozszerzenie było obsługiwane przez wcześniejsze wersje CRT i może być zmianą powodującą niezgodność dla kodu. Wersje UCRT obsługują ciągi szesnastkowe i zaokrąglanie INF
wartości i NAN
, które nie były obsługiwane we wcześniejszych wersjach. Ta obsługa może również spowodować zmiany powodujące niezgodność w kodzie. Na przykład ciąg "0x1a
" będzie interpretowany jako strtod
0.0 w poprzednich wersjach, ale jako 26.0 w wersji UCRT.
Wymagania
Procedura | Wymagany nagłówek |
---|---|
strtod , _strtod_l |
C: <stdlib.h> C++: <cstdlib> lub <stdlib.h> |
wcstod , _wcstod_l |
C: <stdlib.h> lub <wchar.h> C++: <cstdlib> , <stdlib.h> lub <wchar.h> |
Aby uzyskać więcej informacji o zgodności, zobacz Zgodność.
Przykład
// 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
Zobacz też
Konwersja danych
Obsługa obliczeń matematycznych i zmiennoprzecinkowych
Interpretacja sekwencji znaków wielobajtowych
ustawienia regionalne
Funkcje ciąg-wartość liczbowa
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