2013-02-04 128 views
-1

我正在写一个函数,它将以void指针的形式传递一个float。我正在尝试做的是将该float转换为一个字符串,以便我可以将该二进制数据保存在内存中。例如,调用我的函数如下:将float转换为字符串c

void * f(void * data); 

如果有一个用户我

float value = 3.14; 

我想将其转换为字符串,如下图所示:

"3.14" 

我认为我应该使用的方法是首先确定浮点数内的数值:3.14 =四个值。然后,我将不得不遍历每个值并将其转换为字符。

我遇到的几个问题是1:我不确定是否可以确定与给定的浮点数关联的值的数量。 2:我将如何将每个值转换为相应的字符串?

我碰到itoa和sprintf。然而,itoa不是标准C库的一部分,我不确定sprintf是否会按我的意愿去做。

+2

的sprintf(STR, “%4.2f”,浮动) –

+1

你可能想'sprintf'。你不能(通常)找出一些数字 - 例如,作为(例如)'1.2'传递的东西将会以'1.99999999999999'的顺序结束(超出类型的精度 - 但是二进制浮点数不能精确地表示'0.2'。 –

回答

3

大多数系统(特别是那些POSIX)有snprintf(和strdup),所以如果你想返回字符串,它strdup(那么你需要free的结果,你可以编写

char buf[48]; 
snprintf (buf, sizeof(buf), "%f", x); 

以后)。

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

+1

并且记住稍后释放缓冲区(从'strdup()') – SparKot

+0

假设缓冲区被分配时浮点永远不会大于缓冲区有48个字节? – kubiej21

+0

在大多数PC上,“float”是4个字节;'double'是8个字节;'snprintf'和'strdup'的结果可能有十几个字节(和'malloc'-ed memory像strdup'的'结果往往有一定的开销)。 –