Konvertieren von Float in char*
-
24-10-2019 - |
Frage
Wie kann ich a konvertieren float
Wert zu char*
in C
Sprache?
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 unterscheidenfloat x
Und es als nächstes am höchstenfloat
. Für Deatils siehe Printf-Breite Spezifizierer, um die Genauigkeit des Gleitpunktwerts aufrechtzuerhaltenVerwendung
"%e"
ermöglicht Code, klein zu unterscheidenfloat
s 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);