2011-10-30 106 views
5

我有一个关于使用printf的问题。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 

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

回答

3

发生了什么美好的旧%f

+0

没有得到期望的输出。他的问题应该更直接地提出。 –

+0

@JoeMcGrath:这个问题清楚地说明了家庭作业的味道,我不希望为指导或想法之外的任何形式的家庭作业问题编写代码。 **原因:**我不希望一位坐在我旁边的程序员(尽管今后几年)不能给出提示的源代码。 –

+0

好的,谢谢。我是Stack Overflow的新手,并没有意识到。试图回答问题。我是一个没有上过学的业余爱好者程序员。没有考虑家庭作业。将来会记得这样做。 –

0
"%f" 

例如

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

我需要固定大小的输出字符串。 – user1020803

+0

也不会''%f“'在正数前面显示+符号。 –

+0

“%+ f”会显示符号...但这不是全部问题... – user1020803

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 
+0

我认为snprintf(str,8,“%#+。5f”,0.0003);最重要的是 – user1020803

+0

@ user1020803这在所有情况下都可以工作。在我所有的变化中迷失了不知道为什么我切换到snprintf()后仍然使用sig figs。谢谢。编辑以反映。 –

0

,我能想出的唯一的事情是:

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

在这种情况下,您将需要通过还有一个参数(places_past_decimal),它是该号码左侧未使用的号码中剩余的位数。

+0

我想过,但希望能找到最好的解决方案。 – user1020803

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. 
+0

是的,我忘了NULL – user1020803

+0

这需要在代码中手动计算所需的小数位数。在任何情况下用代码执行此操作的方式是什么? –