我对使用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
我需要什么格式字符串?谢谢你的关注。
答案 0 :(得分:3)
好老%f
答案 1 :(得分:1)
使用snprintf()
截断字符串,包括\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
答案 2 :(得分:1)
以下(几乎)做你想要的。请注意,我将str
数组中的字符数从7更改为8;由于所有输出字符串都包含7个字符,因此sprintf
执行的NULL终止将导致缓冲区溢出。
我的结果与您的结果之间的唯一区别是sprintf
执行的舍入。 AFAIK,解决此问题的唯一方法是使用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.
答案 3 :(得分:0)
"%f"
例如
printf("%f\n", floatVal);
答案 4 :(得分:0)
我能想出的唯一一件事如下:
const char *format = "val = %+6.*f\n";
int places_past_decimal = ???;
printf(format, places_past_decimal, 2.334563f);
在这种情况下,您需要传递一个额外的参数(places_past_decimal
),该参数是数字左侧未使用的数字中剩余的位数。