在c语言中将浮点转换为字符串
我正在编写一个函数,它将以空指针的形式传递一个浮点。我试图做的是将浮点转换成一个等价的字符串,这样我就可以将二进制数据保存在内存中。例如,对my函数的调用如下所示:在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:我不确定是否有可能确定与给定浮点相关的值
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。这是一个很大的问题。