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 na EINVAL , 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 Rutynowych _UNICODE i _MBCS niezdefiniowane _MBCS Zdefiniowane _UNICODE Zdefiniowane
_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. W celu uzyskania więcej informacji, zobacz następujący temat: 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] [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]

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