_ecvt_s
Преобразует значение типа double в строку. Это версия _ecvt с усовершенствованиями безопасности, как описано в Функции безопасности в CRT.
errno_t _ecvt_s(
char * _Buffer,
size_t _SizeInBytes,
double _Value,
int _Count,
int *_Dec,
int *_Sign
);
template <size_t size>
errno_t _ecvt_s(
char (&_Buffer)[size],
double _Value,
int _Count,
int *_Dec,
int *_Sign
); // C++ only
Параметры
[исходящий] _Buffer
Заполняется указателем на строку цифр — результат преобразования.[входящий] _SizeInBytes
Размер буфера в байтах.[входящий] _Value
Число, которое нужно преобразовать.[входящий] _Count
Количество сохраненных цифр.[исходящий] _Dec
Сохраненная позиция десятичной точкой.[исходящий] _Sign
Знак преобразованного числа.
Возвращаемое значение
Ноль, если успешно. Возвращаемое значение — код ошибки в случае сбоя. Коды ошибок определенны в Errno.h. Дополнительные сведения см. в разделе errno, _doserrno, _sys_errlist, and _sys_nerr.
В случае недопустимого параметра, как перечислено в таблице ниже, эта функция вызывает обработчик недопустимых параметров, как описано в разделе Проверка параметров. Если продолжение выполнения разрешено, функция устанавливает errno в EINVAL и возвращает EINVAL.
Условия возникновения ошибки
_Buffer |
_SizeInBytes |
_Value |
_Count |
_Dec |
_Sign |
Возвращаемое значение |
Значение в buffer |
---|---|---|---|---|---|---|---|
NULL |
any |
any |
any |
any |
any |
EINVAL |
Без изменений. |
Не NULL (указывает на допустимый адрес памяти) |
<=0 |
any |
any |
any |
any |
EINVAL |
Без изменений. |
any |
any |
any |
any |
NULL |
any |
EINVAL |
Без изменений. |
any |
any |
any |
any |
any |
NULL |
EINVAL |
Без изменений. |
Проблемы безопасности
_ecvt_s может создать ошибку нарушения прав доступа, если buffer не указывает на допустимый адрес памяти и не NULL.
Заметки
Функция _ecvt_s преобразует число с плавающей точкой в строку символов. Параметр _Value — число с плавающей точкой, которое требуется преобразовать. Эта функция сохраняет до count цифр _Value в виде строки и добавляет нулевой символ ('\0'). Если число цифр в _Value превышает _Count, разряды низких порядков округляются. Если количество цифр меньше, чем count, строка дополняется нулями.
Только цифры хранятся в строке. Положение десятичной запятой и знак _Value можно получить из _Dec и _Sign после вызова. Параметр _Dec указывает на целочисленное значение; это целочисленное значение представляет положение десятичной точкой относительно начала строки. Ноль или отрицательное целое число означают, что десятичная запятая располагается слева от первой цифры. Параметр _Sign указывает на целое число, указывающее знак преобразованного числа. Если целочисленное значение 0, то число положительно. В противном случае число будет отрицательным.
Буфера длиной _CVTBUFSIZE достаточно для любого значения с плавающей точкой.
Различие между _ecvt_s и _fcvt_s в интерпретации параметра _Count. _ecvt_s интерпретирует _Count как общее число цифр в выходной строке, тогда как _fcvt_s интерпретирует _Count как количество цифр после десятичной точкой.
В C++ использование этой функции упрощено шаблонной перегрузкой; перегрузка может определить длину буфера автоматически, устранена необходимость указывать аргумент size. Дополнительные сведения см. в разделе Безопасные перегрузки шаблонов.
Отладочная версия этой функции сначала заполняет буфер значением 0xFD. Для отключения данного поведения используйте _CrtSetDebugFillThreshold.
Требования
Функция |
Обязательный заголовок |
Необязательный заголовок |
---|---|---|
_ecvt_s |
<stdlib.h> |
<errno.h> |
Дополнительные сведения о совместимости см. в разделе Совместимость во введении.
Пример
// ecvt_s.c
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main( )
{
char * buf = 0;
int decimal;
int sign;
int err;
buf = (char*) malloc(_CVTBUFSIZE);
err = _ecvt_s(buf, _CVTBUFSIZE, 1.2, 5, &decimal, &sign);
if (err != 0)
{
printf("_ecvt_s failed with error code %d\n", err);
exit(1);
}
printf("Converted value: %s\n", buf);
}