Поделиться через


strtod, , _strtod_lwcstod_wcstod_l

Преобразование строки в значение двойной точности.

Синтаксис

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

Параметры

strSource
Строка, завершающаяся символом NULL, для преобразования.

endptr
Указатель на символ, который останавливает сканирование.

locale
Используемый языковой стандарт.

Возвращаемое значение

strtod возвращает значение числа с плавающей запятой, за исключением случаев, когда представление приведет к переполнению, в этом случае функция возвращает значение +/-HUGE_VAL. Знак соответствия знаку HUGE_VAL значения, которое не может быть представлено. strtod возвращается, если преобразование не может быть выполнено или возникает 0 недополука.

wcstod возвращает значения аналогично strtod:

  • Для обеих функций при возникновении переполнения или потери значимости для параметра errno устанавливается значение ERANGE.
  • Если есть недопустимые параметры, errno устанавливается EINVAL значение и вызывается обработчик недопустимых параметров, как описано в разделе "Проверка параметров".

Дополнительные сведения об этом и других кодах возврата см. в разделе errno, _doserrno_sys_errlistи _sys_nerr.

Замечания

Каждая функция преобразует входную строку strSource в double. Функция strtod преобразует strSource в значение двойной точности. strtod останавливает чтение строки strSource на первом символе, которую невозможно распознать как часть числа. Этот символ может быть завершающим символом NULL. wcstod— это версия strtod с расширенными символами; ее аргумент strSource — строка расширенных символов. В остальном эти функции ведут себя одинаково.

По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это поведение, см . статью "Глобальное состояние" в CRT.

Сопоставления подпрограмм универсального текста

TCHAR.H рутина _UNICODE и _MBCS не определен _MBCS Определенные _UNICODE Определенные
_tcstod strtod strtod wcstod
_tcstod_l _strtod_l _strtod_l _wcstod_l

Параметр LC_NUMERIC категории текущего языкового стандарта определяет распознавание символа точки радикса в strSource. Дополнительные сведения см. в разделе setlocale. Функции без _l суффикса используют текущий языковой стандарт. _strtod_l _strtod Кроме того, бывший использует locale переданный. Дополнительные сведения см. в разделе Locale.

Если endptr это не NULLтак, указатель на символ, который остановил сканирование, хранится в расположении, на которое указывает endptr. Если не удается выполнить преобразование (не найдены допустимые цифры или указано недопустимое основание), значение strSource сохраняется в расположении, указанном endptr.

strtodstrSource Ожидается, что он указывает на строку одной из следующих форм:

[] [whitespace]sign {digits [ ] digitsradix | radix digits} [{e | E} [sign] ] digits
[] [whitespace]sign {0x0X | } {hexdigits [ ]radix hexdigits| radix hexdigits} [{p | P} [sign] ] digits
[] [whitespace] {INF | INFINITY}sign
[] [whitespace] [sign] NAN [sequence]

Необязательный ведущий whitespace может состоять из пробелов и символов табуляции, которые игнорируются.
sign значение "плюс" (+) или "минус" (-).
digits — это одна или несколько десятичных цифр.
hexdigits — одна или несколько шестнадцатеричных цифр.
radix — это символ точки радикса, точка (.) в языковом стандарте по умолчанию "C" или значение конкретного языкового стандарта, если текущий языковой стандарт отличается или когда locale указан.
A sequence — это последовательность буквенно-цифровых символов или символов подчеркивания.

В десятичных и шестнадцатеричных формах чисел, если цифры не отображаются до символа точки радикса, по крайней мере один должен отображаться после символа точки радикса.

В десятичной форме десятичные цифры можно следовать экспоненту, которая состоит из вводной буквы (e или E) и дополнительного целого числа со знаком.

В шестнадцатеричной форме шестнадцатеричные цифры можно следовать экспоненту, которая состоит из вводной буквы (p или P) и необязательного десятичного целого числа со знаком, представляющего экспонент как мощность 2.

В любой форме, если нет экспонентной части или символа точки радикса, предполагается, что символ точки радикса следует за последней цифрой в строке.

Регистр игнорируется как в формах, так и NAN в формахINF. Первый символ, который не соответствует одной из этих форм, останавливает сканирование.

Версии UCRT этих функций не поддерживают преобразование букв стилей Фортрана (d или D) экспонентов. Это нестандартное расширение поддерживалось в более ранних версиях CRT и может оказаться критическим изменением для вашего кода. Версии UCRT поддерживают шестнадцатеричные строки и циклический обход INF NAN и значения, которые не поддерживаются в более ранних версиях. Эта поддержка также может привести к критическим изменениям в коде. Например, строка "0x1a" будет интерпретирована strtod как 0.0 в предыдущих версиях, но как 26.0 в версии UCRT.

Требования

Маршрут Обязательный заголовок
strtod, _strtod_l C: C++<cstdlib>: <stdlib.h> или<stdlib.h>
wcstod, _wcstod_l C: или <wchar.h> C++: <cstdlib><stdlib.h> , <stdlib.h>или<wchar.h>

Дополнительные сведения о совместимости см. в разделе Совместимость.

Пример

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

См. также

Преобразование данных
Поддержка математических и плавающих точек
Интерпретация последовательностей многобайтовых символов
Локаль
Строки в числовые функции значений
strtol, , wcstol_strtol_l_wcstol_l
strtoul, , _strtoul_lwcstoul_wcstoul_l
atof, , _atof_l_wtof_wtof_l
localeconv
_create_locale, _wcreate_locale
_free_locale