在 C 中将字符串转换为浮点数?
Converting string to float in C?
是的,所以在我的 C 程序中我有一个从文件中获取浮点值的函数,在这里我试图做相反的事情,获取字符串并将其转换为浮点数。
float PsSc = atoi(stock01[DataCount].defPsSc);
我知道我的错误,我认为它适用于整数和浮点数,但事实并非如此。
我试过了
float PsSc = atof(stock01[DataCount].defPsSc);
那也不管用。
所以,我的问题是:我可以用什么替换我当前的代码行以使其工作?
输入:1.45。预期输出:1.45,实际输出:1.00
编辑:
printf("\nYour previous speed was : %.2f Metres per Second",PsSc);
尝试使用更具体的sscanf
:
参考:http://www.cplusplus.com/reference/cstdio/sscanf/
float PsSc;
sscanf(stock01[DataCount].defPsSc, "%f", &PsSc);
#include <stdio.h>
int main(void) {
char * str = "1.45";
float flt;
sscanf(str, "%f", &flt);
printf("value = %f\n", flt);
return 0;
}
strtod()
函数系列就是您要找的。
不仅会 strtod()
将输入字符串转换为 double
(strtof()
用于 float
,strtold()
用于 long double
) ,它还会告诉您 停止 解析输入字符串的确切位置(通过第二个参数)。
请注意,strtod()
或 atof()
期望小数 point 还是小数 comma[= 取决于语言环境30=]...
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <errno.h>
#include <stdio.h>
int main()
{
// play with "." vs. "," to see why this might be your problem
char * input = "1.45";
// will take a pointer beyond the last character parsed
char * end_ptr;
// strto...() might give an error
errno = 0;
// convert
float result = strtof( input, &end_ptr );
if ( errno == ERANGE )
{
// handle out-of-range error - result will be HUGE_VALF
puts( "out of range" );
}
if ( end_ptr != ( input + strlen( input ) ) )
{
// handle incomplete parse
printf( "Unparsed: '%s'\n", end_ptr );
}
printf( "result: %.2f\n", result );
return 0;
}
为什么我们不应该使用 atof
成功后,atof() 函数 returns 转换后的浮点数作为双精度值。如果无法执行有效转换,则函数 returns 归零 (0.0)。如果转换后的值超出双精度值的可表示值范围,则会导致 未定义的行为。
相反,我们应该使用 <stdlib.h>
中的 strtod()
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char s[] = "1.45";
printf("Float value : %4.2f\n",strtod(s,NULL));
return 0;
}
它将正确打印 1.45
请看这里的插图http://ideone.com/poalgY
是的,所以在我的 C 程序中我有一个从文件中获取浮点值的函数,在这里我试图做相反的事情,获取字符串并将其转换为浮点数。
float PsSc = atoi(stock01[DataCount].defPsSc);
我知道我的错误,我认为它适用于整数和浮点数,但事实并非如此。
我试过了
float PsSc = atof(stock01[DataCount].defPsSc);
那也不管用。
所以,我的问题是:我可以用什么替换我当前的代码行以使其工作?
输入:1.45。预期输出:1.45,实际输出:1.00
编辑:
printf("\nYour previous speed was : %.2f Metres per Second",PsSc);
尝试使用更具体的sscanf
:
参考:http://www.cplusplus.com/reference/cstdio/sscanf/
float PsSc;
sscanf(stock01[DataCount].defPsSc, "%f", &PsSc);
#include <stdio.h>
int main(void) {
char * str = "1.45";
float flt;
sscanf(str, "%f", &flt);
printf("value = %f\n", flt);
return 0;
}
strtod()
函数系列就是您要找的。
不仅会 strtod()
将输入字符串转换为 double
(strtof()
用于 float
,strtold()
用于 long double
) ,它还会告诉您 停止 解析输入字符串的确切位置(通过第二个参数)。
请注意,strtod()
或 atof()
期望小数 point 还是小数 comma[= 取决于语言环境30=]...
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <errno.h>
#include <stdio.h>
int main()
{
// play with "." vs. "," to see why this might be your problem
char * input = "1.45";
// will take a pointer beyond the last character parsed
char * end_ptr;
// strto...() might give an error
errno = 0;
// convert
float result = strtof( input, &end_ptr );
if ( errno == ERANGE )
{
// handle out-of-range error - result will be HUGE_VALF
puts( "out of range" );
}
if ( end_ptr != ( input + strlen( input ) ) )
{
// handle incomplete parse
printf( "Unparsed: '%s'\n", end_ptr );
}
printf( "result: %.2f\n", result );
return 0;
}
为什么我们不应该使用 atof
成功后,atof() 函数 returns 转换后的浮点数作为双精度值。如果无法执行有效转换,则函数 returns 归零 (0.0)。如果转换后的值超出双精度值的可表示值范围,则会导致 未定义的行为。
相反,我们应该使用 <stdlib.h>
strtod()
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char s[] = "1.45";
printf("Float value : %4.2f\n",strtod(s,NULL));
return 0;
}
它将正确打印 1.45
请看这里的插图http://ideone.com/poalgY