2010-06-07 155 views
11

如何在C語言中將float值轉換爲char*將float轉換爲char *

+6

你需要更具體。你想要什麼 - 浮點數的文本表示形式?您可以輕鬆地傳遞字節流,並稍後用於重新構建浮點數? – crazyscot 2010-06-07 10:46:55

回答

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

這將的myFloat字符串表示存儲在myCharPointer。確保字符串足夠大以容納它。

snprintfsprintf一個更好的選擇,因爲它保證它永遠不會寫了緩衝區的你的說法提供了大小2

+5

使用snprintf,以確保沒有緩衝區溢出。 – JeremyP 2010-06-07 11:07:01

+0

好主意!我會添加到我的答案... – 2010-06-07 11:09:44

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

sprintf:(從MSDN)

+0

@aJ將值打印到緩衝區時,將在控制檯上打印相同的打印語句。 – boom 2010-06-07 11:00:42

+0

sprintf將在緩衝區中寫入浮點值。如果你想打印相同的控制檯使用printf(「%f」... ... – 2010-06-07 11:02:43

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,即使它必須指定它是一個GNU擴展afaik。(asprintf是我的意思是GNU分機) – ShinTakezou 2010-06-07 10:55:06

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

在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

在接受答案後很久。

使用sprintf()或相關函數,因爲許多其他人有建議的答案,但使用更好的格式說明符。

使用"%.*e",代碼解決了各種問題:

  • 所需的最大緩衝區大小是更爲合理,喜歡18 sprintf(buf, "%f", FLT_MAX);可能需要47+。 sprintf(buf, "%f", DBL_MAX);可能需要317+

  • 使用".*"允許代碼來定義區分的float x字符串版本所需的小數位的數量和其下一個最高float。對於deatils,見Printf width specifier to maintain precision of floating-point value

  • "%e"使用允許代碼彼此區分小float做得相當不是所有的打印"0.000000"其結果|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); 
    

思路:
IMO,最好使用2倍緩衝區大小便箋像buf[FLT_STRING_SIZE*2]
爲了增強健壯性,請使用snprint()

2
typedef union{ 
    float a; 
    char b[4]; 
} my_union_t; 

您可以逐字節地訪問浮點數據值,並通過8位輸出緩衝區(例如USART)發送數據,而無需強制轉換。

+0

Upd:不要忘記處理器的排序! – Peter 2016-08-07 11:35:29