Conversione galleggiante char *
-
24-10-2019 - |
Domanda
Come posso convertire un valore float
a char*
nel linguaggio C
?
Soluzione
char buffer[64];
int ret = snprintf(buffer, sizeof buffer, "%f", myFloat);
if (ret < 0) {
return EXIT_FAILURE;
}
if (ret >= sizeof buffer) {
/* Result was truncated - resize the buffer and retry.
}
che memorizzerà la rappresentazione di stringa di myFloat
in myCharPointer
. Assicurarsi che la stringa è abbastanza grande da contenere, però.
snprintf
è una scelta migliore rispetto sprintf
in quanto garantisce non potrà mai scrivere oltre la dimensione del buffer fornite in argomento 2.
Altri suggerimenti
char array[10];
sprintf(array, "%f", 3.123);
sprintf : (da MSDN)
In Arduino:
//temporarily holds data from vals
char charVal[10];
//4 is mininum width, 3 is precision; float value is copied onto buff
dtostrf(123.234, 4, 3, charVal);
monitor.print("charVal: ");
monitor.println(charVal);
Molto tempo dopo che accetta risposta.
Usa sprintf()
, o funzioni correlate, come molti altri hanno suggerito le risposte, ma utilizzare una migliore identificatore di formato.
Utilizzando "%.*e"
, risolve vari problemi di codice:
-
La dimensione massima del buffer necessaria è molto più ragionevole, come 18.
sprintf(buf, "%f", FLT_MAX);
possono necessitare 47+.sprintf(buf, "%f", DBL_MAX);
può avere bisogno di 317 + -
Utilizzando
".*"
consente il codice per definire il numero di cifre decimali necessari per distinguere una versione stringa difloat x
e successivo più altofloat
. Per deatils, vedi Printf larghezza specificatore di mantenere la precisione di galleggiare valore -point -
Utilizzando
"%e"
consente al codice di distinguere piccolifloat
s gli uni dagli altri, piuttosto che tutto"0.000000"
di stampa che è il risultato quando|x| < 0.0000005
.#define FLT_STRING_SIZE (1+1+1+(FLT_DECIMAL_DIG-1)+1+1+ 4 +1) // - d . dddddddd e - dddd \0 char buf[FLT_STRING_SIZE]; sprintf(buf, "%.*e", FLT_DECIMAL_DIG-1, some_float);
Idee:
IMO, meglio utilizzare 2x dimensione del buffer per i rilievi di scratch come buf[FLT_STRING_SIZE*2]
.
Per una maggiore resistenza, l'uso snprintf()
.
char* str=NULL;
int len = asprintf(&str, "%g", float_var);
if (len == -1)
fprintf(stderr, "Error converting float: %m\n");
else
printf("float is %s\n", str);
free(str);
typedef union{
float a;
char b[4];
} my_union_t;
È possibile accedere a galleggiare valore di dati byte per byte e inviarlo attraverso buffer di uscita a 8-bit (ad esempio USART) senza fusione.
char array[10];
snprintf(array, sizeof(array), "%f", 3.333333);