Frage

Wie kann ich a konvertieren float Wert zu char* in C Sprache?

War es hilfreich?

Lösung

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.
}

Das speichert die String -Darstellung von myFloat in myCharPointer. Stellen Sie jedoch sicher, dass die Saite groß genug ist, um sie zu halten.

snprintf ist eine bessere Option als sprintf Da es garantiert, wird es niemals die Größe des Puffers überschreiten, den Sie in Argument 2 liefern.

Andere Tipps

char array[10];
sprintf(array, "%f", 3.123);

Sprintf: (von 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);

Lange nach der Annahme der Antwort.

Verwenden sprintf(), oder verwandte Funktionen, wie viele andere Antworten vorgeschlagen haben, verwenden jedoch einen besseren Formatspezifizierer.

Verwendung "%.*e", Code löst verschiedene Probleme:

  • Die maximale benötigte Puffergröße ist weitaus vernünftiger, wie 18. sprintf(buf, "%f", FLT_MAX); könnte 47+ brauchen. sprintf(buf, "%f", DBL_MAX); Möglicherweise benötigen 317+

  • Verwendung ".*" Ermöglicht Code, die Anzahl der Dezimalstellen zu definieren, die erforderlich sind, um eine String -Version von zu unterscheiden float x Und es als nächstes am höchsten float. Für Deatils siehe Printf-Breite Spezifizierer, um die Genauigkeit des Gleitpunktwerts aufrechtzuerhalten

  • Verwendung "%e" ermöglicht Code, klein zu unterscheiden floats voneinander und nicht von allen Drucken "0.000000" Welches ist das Ergebnis, wenn |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);
    

Ideen:
IMO, besser zu verwenden, um die 2x -Puffergröße für Kratzpolster wie zu verwenden buf[FLT_STRING_SIZE*2].
Verwenden Sie für zusätzliche Robustheit 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;

Sie können auf Float Data Value Byte per Byte zugreifen und es über 8-Bit-Ausgangspuffer (z. B. USAart) ohne Casting senden.

char array[10];
snprintf(array, sizeof(array), "%f", 3.333333);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top