printf浮点数的字符串格式化

5

我有一个关于使用printf的问题。

char str[8];
float val = 2.334563;
sprintf(str, format, val);
printf("val = %s.\n", str);

val = -23.34563;
sprintf(str, format, val);
printf("val = %s.\n", str);

val = -0.02334563;
sprintf(str, format, val);
printf("val = %s.\n", str);

val = 233;
sprintf(str, format, val);
printf("val = %s.\n", str);

期望的输出如下所示:
val = +2.3345
val = -23.345
val = -0.0233
val = +233.00

我需要什么格式的字符串?感谢您的关注。
5个回答

3

好久不见了,经典的%f去哪儿了呢?


没有得到期望的输出。他的问题应该更直接地问。 - Joe McGrath
@JoeMcGrath:这个问题显然是作业,我不喜欢为作业问题编写任何形式的代码,除了给出指针或想法。原因:我不想在我旁边坐着一个程序员(虽然几年后)不能根据提示编写源代码。 - Alok Save
好的,谢谢。我是 Stack Overflow 的新手,不知道这一点。只是想回答问题。我是一个业余程序员,没有上过学。没有考虑到作业任务。以后会记住的。 - Joe McGrath
2
@JoeMcGrath:好的,请。我理解你的热情和愿意帮助,但我们不想把SO变成一个“做我的作业”网站。通常,对于那些有作业味道的问题,我们希望看到提问者尝试过什么、付出了多少努力以及他们解决问题的想法。然后提供微妙的提示/线索,给他们指明方向并解除障碍,但也留下足够的大量作业要做。作为一个业余程序员,你肯定知道,没有比努力工作更好的选择了。欢迎来到SO,希望能在这里见到你。一切顺利 :) - Alok Save

1
使用snprintf()函数将字符串截断为包括\0在内的8个字符。
"%#+.5f"

%   modifier
#   force decimal place
+   show + or -
.5  precision of 5
f   use precision as places after decimal 

代码:

char str[8];
float val = 2.334563;
snprintf(str,8, "%#+.5f", val);
printf("val = %s\n", str);

val = -23.34563;
snprintf(str,8, "%#+.5f", val);
printf("val = %s\n", str);

val = -0.02334563;
snprintf(str,8, "%#+.5f", val);
printf("val = %s\n", str);

val = 233.001;
snprintf(str,8, "%#+.5f", val);
printf("val = %s\n", str);

输出:

val = +2.3345
val = -23.345
val = -0.0233
val = +233.00
val = +0.0003

我认为snprintf(str, 8, "%#+.5f", 0.0003);是最好的。 - user1020803
@user1020803 这在所有情况下都有效。在我做了那么多修改后,不确定为什么我还在使用 sig figs,明明已经切换到 snprintf() 了。谢谢你的指正,我已经进行了编辑以反映这一点。 - Joe McGrath

1

以下代码(几乎)可以实现您想要的功能。请注意,我将str数组中的字符数从7更改为8;由于您所有的输出字符串都包含7个字符,因此sprintf执行的NULL终止会导致缓冲区溢出。

我的结果与您的唯一区别是sprintf执行的四舍五入。据我所知,解决这个问题的唯一方法是使用floor预先截断要打印的数字;例如,要打印2位小数而不进行四舍五入,可以使用float f = floor( 1.8888 * 100 ) / 100;

#include <stdio.h>

int main(void)
{
  char str[8];

  {
    float val = 2.334563f;
    sprintf(str, "%+6.*f", 4, val);
    printf("val = %s.\n", str);
  }

  {
    float val = -23.34563f;
    sprintf(str, "%+6.*f", 3, val);
    printf("val = %s.\n", str);
  }

  {
    float val = -0.02334563f;
    sprintf(str, "%+6.*f", 4, val);
    printf("val = %s.\n", str);
  }

  {
    float val = 233.0f;
    sprintf(str, "%+6.*f", 2, val);
    printf("val = %s.\n", str);
  }

  return 0;
}

输出:

val = +2.3346.
val = -23.346.
val = -0.0233.
val = +233.00.

这需要在代码中手动计算所需的小数位数。有没有一种适用于任何情况的代码方式来实现这个呢? - Joe McGrath

1
"%f"

例子

printf("%f\n", floatVal);

我需要一个固定大小的输出字符串。 - user1020803
"%f" 也不会在正数前面显示加号。 - Bill Lynch

0
我能想到的唯一一件事是:
const char *format = "val = %+6.*f\n";
int places_past_decimal = ???;
printf(format, places_past_decimal, 2.334563f);

在这种情况下,您需要传递一个额外的参数(places_past_decimal),它是数字中未被左侧使用的剩余位数。

我考虑过这个问题,但希望能找到最好的解决方案。 - user1020803

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接