如何在c中简单地将浮点数转换为字符串?

问题描述 投票:0回答:4
FILE * fPointer;
float amount = 3.1415;
fPointer =fopen("vending.txt","w");
fprintf(fPointer, amount);
printf("The file has been created for the first time and we added the value %f", amount);
fclose(fPointer);

我正在尝试将浮点数保存到文本文件中,但是当我尝试运行此代码时,它会触发编译错误,因为函数

fprintf
期望第二个参数是字符数组,所以我如何将浮点数转换为一个字符串,这样我就可以传递它,我有一个 C# 背景,其中类似
.toString()
的东西是可能的,那么 C 中是否有类似的东西可以直接将浮点数转换为字符串?

c
4个回答
16
投票

如果可以使用C99标准,那么最好的方法是使用

snprintf
函数。第一次调用时,您可以向它传递一个零长度(空)缓冲区,然后它将返回将浮点值转换为字符串所需的长度。然后根据返回的内容分配所需的内存,然后安全地转换。

这解决了此处讨论的 sprintf 问题。

示例:

int len = snprintf(NULL, 0, "%f", amount);
char *result = malloc(len + 1);
snprintf(result, len + 1, "%f", amount);
// do stuff with result
free(result);

8
投票

第二个参数是格式字符串,后面跟有格式参数:

fprintf(fPointer, "%f", amount);

%f
告诉
fprintf
将此参数 (
amount
) 写入浮点值的字符串表示形式。

可以(例如)在此处找到可能的格式说明符列表。


3
投票

通过使用

sprintf()
我们可以将c语言中的float转换为string 为了更好地理解,请参阅下面的代码

#include <stdio.h>
int main()
{
   float f = 1.123456789;
   char c[50]; //size of the number
   sprintf(c, "%g", f);
   printf(c);
   printf("\n");
}

希望这对您有帮助。


2
投票

将浮点数保存到文本文件中

使用

"%e"
"%g"
"%a"

要为每个 float 打印

唯一
文本,请使用具有足够精度的格式字符串
"%.*e"
"%.g"
"%a"

FLT_DECIMAL_DIG - 1
"%.*f"

所需的位数 (
FLT_DECIMAL_DIG
是需要的位数,带
"%.*g"
)
唯一地打印每个
float
值,而不会过度精确。

#include <float.h>
#include <stdio.h>

fprintf(fPointer, "%.*e", FLT_DECIMAL_DIG - 1, amount);
// or 
fprintf(fPointer, "%.g", FLT_DECIMAL_DIG, amount);
// or 
fprintf(fPointer, "%a", amount); // Hexadecimal significand

这样做的好处是,可以预先计算想要打印到字符串所需的字符上限(通常约为 18 个)。

//                     -   d   .      dddddddd             e   -  expo \0
#defined FLT_STR_SIZE (1 + 1 + 1 + (FLT_DECIMAL_DIG - 1) + 1 + 1 + 4 + 1
char buffer[FLT_STR_SIZE];
snprintf(buffer, sizeof buffer, "%.*e", FLT_DECIMAL_DIG - 1, amount);

"%f"
弱点

使用

"%f"
将打印近一半的小
float
,如
0.000000001f
-1.2345e-10
0.000000
-0.000000

使用

"%f"
将打印大的
float
,如
FLT_MAX
,并带有详细文本,如“340282346638528859811704183484516925440.000000”。


OP的编码错误包括:

// OP's code           v---- Format string expected here. 
// fprintf(fPointer, amount);
© www.soinside.com 2019 - 2024. All rights reserved.