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

這需要在代碼中手動計算所需的小數位數。在任何情況下用代碼執行此操作的方式是什麼? –