Domanda

Come posso convertire un valore float a char* nel linguaggio C?

È stato utile?

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 di float x e successivo più alto float. Per deatils, vedi Printf larghezza specificatore di mantenere la precisione di galleggiare valore -point

  • Utilizzando "%e" consente al codice di distinguere piccoli floats 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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top