将`float`变量转换为字符串inC?

时间:2016-06-03 23:12:10

标签: c

我们说我有:

f = ((100+x)/x)*1.5. 

其中f的类型为float

如何将其转换为具有指定精度的字符串?

4 个答案:

答案 0 :(得分:0)

始终尝试使用标准库功能。从float创建字符串,精确,你可以使用sprintf。

示例:

#include <stdio.h>
#include <math.h>

int main()
{
   char str[80];
   sprintf(str, "Value of Pi = %f", M_PI);

   return(0);
}

答案 1 :(得分:0)

使用snprintf将float编码为字符串并将其放入您提供的字符缓冲区中。第二个参数是缓冲区的大小,以确保您不会溢出可用空间。您还需要检查snprintf的结果,以确保成功创建字符串而不会溢出。

#include <assert.h>
#include <stdio.h>

int main()
{
      float number_as_float = 6.02;
      char number_as_ascii[40];
      assert(snprintf(number_as_ascii, 40, "%f", number_as_float) <= 40);
      return(0);
}

答案 2 :(得分:0)

  

如何将其转换为具有指定精度的字符串?

有两种方法可以考虑double/float x精度

在相对意义上

int precision = 7;
// print to the 1+7 most significant digits
printf("%.*e\n", precision, x);

绝对意义上的

int precision = 7;
// print to the closest 0.0000001
printf("%.*f\n", precision, x);

打印到字符串时,两者都存在字符串/空间管理问题。假设缓冲区不会溢出,使用sprintf()代替printf()就足够了。

int precision = 7;
//     sign dig  .   precision   e  sign expo \0
char buf[1 + 1 + 1 + precision + 1 + 1 + 5 + 1];
// print to the 1+7 most significant digits
sprintf(buf, "%.*e", precision, x);

使用%f非常棘手,因为数字可能是DBL_MAX需要数百或数千个数字。

int precision = 7;
//     sign  ------digs--------   .   precision  \0
char buf[1 + DBL_MAX_10_EXP + 1 + 1 + precision + 1];
// print to the closest 0.0000001
sprintf(buf, "%.*f", precision, x);

一种经典的方法是使用snprintf()计算所需的空间,通过0空间调用一次,然后确定大小需求。 snprintf()不会溢出给定大小的缓冲区。仍然需要检查snprintf()结果以检测缓冲区尺寸过小的情况。

int need = snprintf(NULL, 0, some_format, x);
assert(need >= 0);
char *buf = malloc(need + 1u);
assert(buf);
int need2 = snprintf(buf, need + 1u, same_format_as_before, x);
assert(need2 == need);
...
// do something with buf
...
free(buf);

注意:考虑到极端数字和 locale 效果,很容易错误地缩小缓冲区的大小。

注意:此处的某些代码假定指数不会超过5位数或99999.强大的解决方案可根据需要调整大小。

答案 3 :(得分:-1)

使用sprintf功能。

float f = 100/3;
char *s = malloc(128);
sprintf(s, "%f", f);