Conversion de flotteur char *
-
24-10-2019 - |
Question
Comment puis-je convertir une valeur float
à char*
en langage C
?
La solution
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.
}
qui stockera la représentation de chaîne de myFloat
dans myCharPointer
. Assurez-vous que la chaîne est assez grand pour contenir, cependant.
snprintf
est une meilleure option que sprintf
car elle garantit qu'il ne sera jamais écrire passé la taille de la mémoire tampon que vous fournissez en argument 2.
Autres conseils
char array[10];
sprintf(array, "%f", 3.123);
sprintf : (à partir de MSDN)
Dans 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);
Long accepter après la réponse.
Utilisez sprintf()
ou fonctions connexes, comme beaucoup d'autres ont suggéré des réponses, mais utiliser un meilleur spécificateur de format.
Utilisation "%.*e"
, permet de résoudre divers problèmes de code:
-
La taille maximale du tampon nécessaire est beaucoup plus raisonnable, comme 18
sprintf(buf, "%f", FLT_MAX);
pourrait avoir besoin 47+.sprintf(buf, "%f", DBL_MAX);
peut avoir besoin 317 + -
Utilisation
".*"
permet au code de définir le nombre de décimales nécessaires pour distinguer une version de chaîne defloat x
et le plus élevé suivantfloat
. Pour deatils, voir spécificateur Printf largeur pour maintenir la précision de flotter -point valeur -
Utilisation
"%e"
permet au code de distinguer les petitsfloat
s les uns des autres plutôt que tous"0.000000"
d'impression qui est le résultat lorsque|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);
Idées:
OMI, mieux utiliser 2x taille tampon pour les plaquettes à gratter comme buf[FLT_STRING_SIZE*2]
.
Pour plus de robustesse, l'utilisation 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;
Vous pouvez accéder à flotter octet de valeur de données par octet et l'envoyer à travers un tampon de sortie à 8 bits (par exemple USART) sans moulage.
char array[10];
snprintf(array, sizeof(array), "%f", 3.333333);