5

Ho una domanda sull'utilizzo di printf.formato stringa per valori in virgola mobile 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); 

Il risultato atteso segue:

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

Cosa stringa di formato ho bisogno per questo? Grazie per l'attenzione.

risposta

3

quello che è successo al buon vecchio %f

+0

non ottenere output desiderato. La sua domanda dovrebbe essere fatta più direttamente. –

+0

@JoeMcGrath: Questo Q odora chiaramente di compiti a casa e non apprezzo la scrittura di alcuna forma di codice per le domande sui compiti a casa, oltre a fornire indicazioni o idee. ** Motivo: ** Non voglio un programmatore seduto proprio accanto a me (anche se pochi anni da adesso) che non possono scrivere un codice sorgente dato un suggerimento. –

+0

Ok, grazie. Sono nuovo di Stack Overflow e non ho capito. Sto solo cercando di rispondere alle domande. Sono un programmatore hobbista che non è stato a scuola. Non pensavo ai compiti a casa. Ricorderà di farlo in futuro. –

0
"%f" 

esempio

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

Ho bisogno di una stringa di output di dimensioni fisse. – user1020803

+0

né '"% f "' mostra il segno + davanti ai numeri positivi. –

+0

"% + f" mostrerà il segno ... Ma questo non è l'intero problema ... – user1020803

1

uso snprintf() per troncare stringa esattamente a 8 caratteri compreso \0

formato stringa:

"%#+.5f" 

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

Codice:

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); 

uscita:

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

Penso che snprintf (str, 8, "% # +. 5f", 0,0003); meglio di tutti – user1020803

+0

@ user1020803 Che funziona in tutti i casi. Mi sono perso in tutti i miei cambiamenti, non sono sicuro del perché stavo ancora usando i sig fichi dopo essere passato a snprintf(). Grazie. modificato per riflettere. –

0

L'unica cosa che posso venire in mente è la seguente:

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

In questo caso, è necessario passare un argomento aggiuntivo (places_past_decimal) che è il numero di cifre rimanenti nel numero che non vengono utilizzate dal lato sinistro del numero .

+0

Ci ho pensato, ma ho sperato nella soluzione migliore. – user1020803

1

Quanto segue (quasi) fa quello che vuoi. Si noti che ho modificato il numero di caratteri nell'array str da 7 a 8; poiché tutte le stringhe di output contengono 7 caratteri, la terminazione NULL eseguita da sprintf causerà altrimenti l'overflow del buffer.

L'unica differenza tra i miei risultati e il vostro è l'arrotondamento eseguito da sprintf. AFAIK, l'unico modo per aggirare questo è pre-troncare il numero che si desidera stampare utilizzando floor; per esempio, per stampare 2 cifre senza arrotondamento 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; 
} 

uscita:

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

Sì, ho dimenticato NULL – user1020803

+0

Ciò richiede il calcolo del numero necessario di posizioni decimali manualmente nel codice. qual è il modo di farlo con il codice per ogni caso? –

Problemi correlati