在c语言中将浮点转换为字符串

在c语言中将浮点转换为字符串,c,floating-point,char,systems-programming,C,Floating Point,Char,Systems Programming,我正在编写一个函数,它将以空指针的形式传递一个浮点。我试图做的是将浮点转换成一个等价的字符串,这样我就可以将二进制数据保存在内存中。例如,对my函数的调用如下所示: void * f(void * data); 如果用户超过我 float value = 3.14; 我想将其转换为字符串,如下所示: "3.14" 我认为我应该使用的方法是,首先确定浮点中的值的数量:3.14=四个值。然后我必须循环遍历每个值并将其转换为一个字符 我遇到的两个问题是1:我不确定是否有可能确定与给定浮点相关的值

我正在编写一个函数,它将以空指针的形式传递一个浮点。我试图做的是将浮点转换成一个等价的字符串,这样我就可以将二进制数据保存在内存中。例如,对my函数的调用如下所示:

void * f(void * data);
如果用户超过我

float value = 3.14;
我想将其转换为字符串,如下所示:

"3.14"
我认为我应该使用的方法是,首先确定浮点中的值的数量:3.14=四个值。然后我必须循环遍历每个值并将其转换为一个字符

我遇到的两个问题是1:我不确定是否有可能确定与给定浮点相关的值的数量。2:如何将每个值转换为其等效字符串

我遇到了伊藤和斯普林特。但是,itoa不是标准库的一部分,我不确定sprintf是否会按照我的要求运行。

大多数系统(尤其是POSIX系统)都有
snprintf
(和
strdup
),因此您可以进行编码

 char buf[48];
 snprintf (buf, sizeof(buf), "%f", x);
如果要返回该字符串,
strdup
it(随后需要
释放
strdup
的结果)

PS:
sprintf
snprintf
更危险,因为它可能会溢出缓冲区大多数系统(尤其是POSIX系统)都有
snprintf
(和
strdup
),因此您可以进行编码

 char buf[48];
 snprintf (buf, sizeof(buf), "%f", x);
如果要返回该字符串,
strdup
it(随后需要
释放
strdup
的结果)


PS:
sprintf
snprintf
更危险,因为它可能会溢出缓冲区

sprintf(str,“%4.2f”,float),您可能需要
sprintf
。您(通常)无法计算出数字的数量——例如,作为
1.2
传递的数字将以
1.9999999999999
的顺序结束(精确到类型的精度——但二进制浮点不能精确地表示
0.2
)您可能需要
sprintf
。您(通常)无法计算出数字的数量——例如,
1.2
传递的数字将以
1.99999999999
的顺序结束(精确到类型的精度——但二进制浮点不能精确表示
0.2
。请记住释放缓冲区(从
strdup()
)稍后。如果缓冲区分配了48个字节,那么可以安全地假设浮点永远不会大于缓冲区吗?大多数PC上的
float
是4个字节;
double
是8个字节;
snprintf
然后
strdup
的结果可能有十几个字节(和
malloc
-ed内存,如
strdup
的结果,通常会有一些开销).
snprintf
自1999年以来一直是C标准的一部分。@BasileStarynkevitch我认为
float
的大小与其字符串表示的大小没有多大关系。将
double
的最大字符数计算为1078。这太多了。请记住释放缓冲区(从
strdup()
)稍后。如果缓冲区分配了48个字节,那么可以安全地假设浮点永远不会大于缓冲区吗?大多数PC上的
float
是4个字节;
double
是8个字节;
snprintf
然后
strdup
的结果可能有十几个字节(和
malloc
-ed内存,如
strdup
的结果,通常会有一些开销)自1999年以来,
snprintf
是C标准的一部分。@BasileStarynkevitch我认为
float
的大小与其字符串表示的大小没有多大关系。计算
double
的最大字符数为1078。这是一个很大的问题。