float から char* への変換
-
24-10-2019 - |
質問
どうすれば変換できますか float
に値を付ける char*
で C
言語?
解決
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 で指定したバッファのサイズを超えて書き込まないことが保証されるためです。
他のヒント
char array[10];
sprintf(array, "%f", 3.123);
sprintf: :( MSDNから)
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);
答えを受け入れてから。
使用する sprintf()
, 、または関連する機能、他の多くの人が提案しているように、より良いフォーマット仕様を使用します。
使用 "%.*e"
, 、コードはさまざまな問題を解決します。
必要な最大バッファサイズは、18のようにはるかに妥当です。
sprintf(buf, "%f", FLT_MAX);
47+が必要になる可能性があります。sprintf(buf, "%f", DBL_MAX);
317+が必要になる場合があります使用
".*"
コードは、文字列バージョンを区別するために必要な小数点以下の場所の数を定義できますfloat x
そして、それは次に最高ですfloat
. 。ディアチルについては、参照してください Floating-Point値の精度を維持するための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 \0 char buf[FLT_STRING_SIZE]; sprintf(buf, "%.*e", FLT_DECIMAL_DIG-1, some_float);
アイデア:
IMO、ようなスクラッチパッドに2xバッファサイズを使用する方が良い buf[FLT_STRING_SIZE*2]
.
堅牢性を追加するには、使用してください snprintf()
.
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;
BYTEごとにFloat Data Value Byteにアクセスし、キャストなしで8ビット出力バッファー(USARTなど)を介して送信できます。
char array[10];
snprintf(array, sizeof(array), "%f", 3.333333);