strtod
, , _strtod_l
wcstod
_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
.
strtod
strSource
Ожидается, что он указывает на строку одной из следующих форм:
[] [whitespace
]sign
{digits
[ ] digits
radix
| radix
digits
} [{e
| E
} [sign
] ] digits
[] [whitespace
]sign
{0x
0X
| } {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_l
wcstoul
_wcstoul_l
atof
, , _atof_l
_wtof
_wtof_l
localeconv
_create_locale
, _wcreate_locale
_free_locale