_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
参数
[out] _Buffer
用指针为数值字符串,转换的结果。[in] _SizeInBytes
缓冲区的大小(以字节为单位)。[in] _Value
数字可被转换.[in] _Count
存储数字的数字。[out] _Dec
存储小数点的位置。[out] _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 |
any |
EINVAL |
未被修改 |
不是 NULL (指向有效的内存) |
<=0 |
any |
any |
any |
any |
EINVAL |
未被修改 |
any |
any |
any |
any |
NULL |
any |
EINVAL |
未被修改 |
any |
any |
any |
any |
any |
NULL |
EINVAL |
未被修改 |
安全问题
如果 buffer 不指向有效的内存和不是 NULL,_ecvt_s 可能会发生访问冲突。
备注
_ecvt_s 函数将浮点数转换为字符字符串。 _Value 参数是转换浮点数。 此函数以存储到 count _Value 数字为字符串并在 null 字符 (“\ 0 ")。 如果数字的数目_Value 的溢出 _Count,低位数舍入。 如果小于精度的 count 位数,用零填充字符串。
只有数字被存储在字符串中。 小数点的位置和_Value 的符号可以在调用之后从 _Dec 和 _Sign 获取。 _Dec 参数指向一个整数值;此整数值指定相对于字符串的开头小数点的位置。 零或负整数值指示小数点位于第一个数的左侧。 到指示所转换的数字符号的整数的 _Sign 参数的位置。 如果整数值为 0,在数字为正数的。 否则,数字为负。
长度 _CVTBUFSIZE 缓冲区。所有浮点值是不够的。
_ecvt_s 和 _fcvt_s 的差异在于对 _Count 参数的解释不同。 _ecvt_s 将 _Count 解释为输出字符串的总位数,而 _fcvt_s 将 _Count 解释为在小数点后的位数。
在 C++ 中,使用这些函数是由重载模板简化;该重载可以自动推断缓冲区长度,而无需指定范围参数。 有关更多信息,请参见安全模板重载。
这些函数的调试版本首先用 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);
}