Wie kann ich einen float
Wert in char*
in C
Sprache umwandeln?Konvertieren von Float in char *
Antwort
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.
}
, dass die String-Darstellung von myFloat
in myCharPointer
gespeichert werden. Stellen Sie jedoch sicher, dass die Zeichenfolge groß genug ist, um sie zu halten.
snprintf
ist eine bessere Option als sprintf
wie es sie nie über die Größe des Puffers schreiben garantiert werden Sie in Argument liefern 2.
Verwenden Sie stattdessen snprintf, um sicherzustellen, dass kein Puffer überläuft. – JeremyP
Tolle Idee! Ich werde das zu meiner Antwort hinzufügen ... –
char array[10];
sprintf(array, "%f", 3.123);
sprintf: (von MSDN)
@aJ Wenn der Wert im Puffer gedruckt wird, wird dieselbe Druckanweisung auch auf der Konsole ausgegeben. – boom
sprintf schreibt den Gleitkommawert in den Puffer. Wenn Sie dasselbe zur Konsole drucken möchten, verwenden Sie printf ("% f" ... –
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);
+1 obwohl es muss angegeben werden, es ist eine GNU-Erweiterung afaik.(asprintf ist ein GNU ext ich meine) – ShinTakezou
char array[10];
snprintf(array, sizeof(array), "%f", 3.333333);
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 Annahme der Antwort.
Verwenden Sie sprintf()
oder verwandte Funktionen, wie viele andere Antworten vorgeschlagen haben, aber verwenden Sie einen besseren Formatbezeichner.
Mit "%.*e"
löst Code verschiedene Fragen:
Die maximale Puffergröße benötigt weit mehr sinnvoll ist, wie 18
sprintf(buf, "%f", FLT_MAX);
47+ brauchen könnte.sprintf(buf, "%f", DBL_MAX);
müssen 317+Mit
".*"
Code ermöglicht es, die Anzahl der Dezimalstellen zu definieren, benötigt einen String-Version vonfloat x
und nächsthöherefloat
zu unterscheiden. Für deatils, voneinander kleinefloat
s zu unterscheiden und nicht alle Druck"0.000000"
Printf width specifier to maintain precision of floating-point valueMit
"%e"
ermöglicht Code sehen, die das Ergebnis ist, 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 wie buf[FLT_STRING_SIZE*2]
2x Puffergröße für Notizblöcke zu verwenden.
Für zusätzliche Robustheit verwenden Sie snprint()
.
Sie können auf den Datenwert Datenbyte by Byte zugreifen und ihn über einen 8-Bit-Ausgabepuffer (z. B. USART) ohne Casting senden.
Upd: Vergessen Sie nicht über die Endlichkeit des Prozessors! – Peter
Sie müssen genauer sein. Was willst du - eine textuelle Darstellung des Dezimalwertes des Floats? Ein Strom von Bytes, den Sie problemlos weitergeben können, um den Float später wieder herzustellen? – crazyscot