【问题标题】:Convert a float into a string in c [closed]在c中将浮点数转换为字符串[关闭]
【发布时间】:2013-02-04 06:36:44
【问题描述】:

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

void * f(void * data);

如果用户经过我

float value = 3.14;

我想把它转换成如下所示的字符串:

"3.14"

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

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

我遇到了 itoa 和 sprintf。但是,itoa 不是标准 C 库的一部分,我不确定 sprintf 是否会如我所愿。

【问题讨论】:

  • sprintf(str, "%4.2f", float)
  • 你可能想要sprintf。您(通常)无法计算出多个数字 - 传递为(例如)1.2 的东西最终会以1.99999999999999 的顺序结束(达到类型的精度 - 但二进制浮点数不能精确表示0.2

标签: c floating-point char systems-programming


【解决方案1】:

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

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

如果你想返回那个字符串,strdup它(然后你需要freestrdup的结果)。

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

【讨论】:

  • 记得稍后释放缓冲区(来自strdup())。
  • 如果缓冲区分配有 48 个字节,假设浮点数永远不会大于缓冲区是否安全?
  • A float 在大多数 PC 上是 4 个字节; double 是 8 个字节; snprintf 然后strdup 的结果可能有十几个字节(而malloc-ed 内存就像strdup 的结果一样经常有一些开销)。
  • snprintf 是自 1999 年以来 C 标准的一部分。
  • @BasileStarynkevitch 我不认为float 的大小与其字符串表示的大小有很大关系。 This answer 计算 double 的最大字符数为 1078。这是很多。
猜你喜欢
  • 2012-06-27
  • 1970-01-01
  • 1970-01-01
  • 2011-11-25
  • 1970-01-01
  • 2011-03-12
  • 1970-01-01
  • 2018-08-07
相关资源
最近更新 更多