Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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
errnojest ustawiona wartośćERANGE, jeśli występuje przepełnienie lub niedopełnienie. - Jeśli istnieją nieprawidłowe parametry,
errnojest 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_errlisti _sys_nerr.
Uwagi
Każda funkcja konwertuje ciąg strSource wejściowy na doublewartość . 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ą ; strtodjego 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 NULLjest , 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.
strtodstrSource 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
[] [whitespacesign] 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