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

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

4

5 回答 5

3

好老人怎么了%f

于 2011-10-30T15:34:01.510 回答
1
"%f"

例子

printf("%f\n", floatVal);
于 2011-10-30T15:36:37.133 回答
1

用于snprintf()截断正好 8 个字符的字符串,包括\0

格式字符串:

"%#+.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
于 2011-10-30T15:36:43.007 回答
1

以下(几乎)可以满足您的需求。请注意,我将str数组中的字符数从 7 个更改为 8 个;由于所有输出字符串都包含 7 个字符,sprintf否则执行的 NULL 终止将导致缓冲区溢出。

我的结果和你的结果之间的唯一区别是sprintf. floorAFAIK,解决此问题的唯一方法是使用;预先截断要打印的数字 例如,打印 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.
于 2011-10-30T15:55:39.170 回答
0

我唯一能想到的如下:

const char *format = "val = %+6.*f\n";
int places_past_decimal = ???;
printf(format, places_past_decimal, 2.334563f);

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

于 2011-10-30T15:46:28.810 回答