質問

どうすれば変換できますか 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.
}

これにより、次の文字列表現が保存されます。 myFloatmyCharPointer. 。ただし、文字列がそれを保持するのに十分な大きさであることを確認してください。

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);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top