2010-06-07 30 views
11

Wie kann ich einen float Wert in char* in C Sprache umwandeln?Konvertieren von Float in char *

+6

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

Antwort

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

+5

Verwenden Sie stattdessen snprintf, um sicherzustellen, dass kein Puffer überläuft. – JeremyP

+0

Tolle Idee! Ich werde das zu meiner Antwort hinzufügen ... –

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

sprintf: (von MSDN)

+0

@aJ Wenn der Wert im Puffer gedruckt wird, wird dieselbe Druckanweisung auch auf der Konsole ausgegeben. – boom

+0

sprintf schreibt den Gleitkommawert in den Puffer. Wenn Sie dasselbe zur Konsole drucken möchten, verwenden Sie printf ("% f" ... –

2
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); 
+0

+1 obwohl es muss angegeben werden, es ist eine GNU-Erweiterung afaik.(asprintf ist ein GNU ext ich meine) – ShinTakezou

0
char array[10]; 
snprintf(array, sizeof(array), "%f", 3.333333); 
4

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); 
1

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 von float x und nächsthöhere float zu unterscheiden. Für deatils, voneinander kleine float s zu unterscheiden und nicht alle Druck "0.000000"Printf width specifier to maintain precision of floating-point value

  • Mit "%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().

2

Sie können auf den Datenwert Datenbyte by Byte zugreifen und ihn über einen 8-Bit-Ausgabepuffer (z. B. USART) ohne Casting senden.

+0

Upd: Vergessen Sie nicht über die Endlichkeit des Prozessors! – Peter