2010-06-07 96 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