Преобразование типа float в char*
как я могу преобразовать float
значение char*
на C
язык?
7 ответов
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
. Однако убедитесь, что строка достаточно велика, чтобы удерживать ее.
snprintf
является лучшим вариантом, чем sprintf
поскольку это гарантирует, что он никогда не будет писать за размер буфера, который вы предоставляете в аргументе 2.
В 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);
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;
вы можете получить доступ к значению данных float байт за байтом и отправить его через 8-битный выходной буфер (например, USART) без кастинга.
долго после принятия ответа.
использовать sprintf()
или связанные функции, как и многие другие, предлагают ответы, но используют лучший спецификатор формата.
используя "%.*e"
, код решает различные вопросы:
максимальный размер буфера необходим гораздо разумнее, как 18.
sprintf(buf, "%f", FLT_MAX);
может понадобиться 47+.sprintf(buf, "%f", DBL_MAX);
может понадобиться 317+используя
".*"
позволяет коду определить количество десятичных знаков, необходимых для различать строковую версиюfloat x
и далее высокиеfloat
. Для деталей, см. спецификатор ширины Printf для поддержания точности значения с плавающей запятой-
используя
"%e"
позволяет коду различать малыеfloat
s друг от друга, а не все печати"0.000000"
что является результатом, когда|x| < 0.0000005
.#define FLT_STRING_SIZE (1+1+1+(FLT_DECIMAL_DIG-1)+1+1+ 4 +1) // - d . dddddddd e - dddd char buf[FLT_STRING_SIZE]; sprintf(buf, "%.*e", FLT_DECIMAL_DIG-1, some_float);
мысли:
IMO, лучше использовать размер буфера 2x для царапин, таких как buf[FLT_STRING_SIZE*2]
.
Для дополнительной надежности используйте snprintf()
.