_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
转换后的数字的符号。

返回值

如果成功,则返回 0。 如果失败,则返回值为错误代码。 错误代码是在 ERRNO.h 中定义的。 有关详细信息,请参阅errno, _doserrno, _sys_errlist_sys_nerr.

如果存在无效参数(如下表中所列),此函数会调用无效参数处理程序,如参数验证中所述。 如果允许执行继续,该函数会将 errno 设置为 EINVAL 并返回 EINVAL

错误条件

buffer sizeInBytes value count dec sign 返回值 buffer 中的值
NULL any any any any 任意 EINVAL 未修改。
NULL(指向有效内存) <=0 any 任意 any any EINVAL 未修改。
any any any 任意 NULL any EINVAL 未修改。
任意 any any 任意 任意 NULL EINVAL 未修改。

安全问题

如果 buffer 不指向有效内存且不为 NULL,则 _ecvt_s 可能生成访问冲突。

备注

_ecvt_s 函数将浮点数转换为字符串。 value 参数是要转换的浮点数。 此函数最多存储 countvalue 作为字符串,并追加空字符 ('\0')。 如果 value 中的数字位数超过 count,则低位数字被舍入。 如果数字位数少于 count,则字符串使用零来填充。

字符串中仅存储位数。 小数点位置和 value 的符号可以在调用后从 decsign 中获取。 dec 参数指向整数值;此整数值给定相对于字符串开头的小数点的位置。 0 或负整数值表示小数点位于第一个数字的左侧。 sign 参数指向一个整数,表示转换后的数字的符号。 如果整数值为 0,则数值为正值。 否认,数值为负值。

_CVTBUFSIZE 的缓冲区长度足以满足任何浮点值。

_ecvt_s_fcvt_s 之间的差异在于对 count 参数的解释。 _ecvt_scount 解释为输出字符串中的数字总位数,而 _fcvt_scount 解释为小数点后面的数字位数。

在 C++ 中,通过模板重载简化此函数的使用;重载可以自动推导出缓冲区长度,不再需要指定大小参数。 有关详细信息,请参阅安全模板重载

此函数的调试版本首先使用 0xFD 填充缓冲区。 若要禁用此行为,请使用 _CrtSetDebugFillThreshold

默认情况下,此函数的全局状态范围限定为应用程序。 若要更改此行为,请参阅 CRT 中的全局状态

要求

函数 必需的标头 可选标头
_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);
}
Converted value: 12000

另请参阅

数据转换
数学和浮点支持
atof_atof_l_wtof_wtof_l
_ecvt
_fcvt_s
_gcvt_s