如何将string转换为浮动?
#include<stdio.h> #include<string.h> int main() { char s[100] ="4.0800" ; printf("float value : %4.8f\n" ,(float) atoll(s)); return 0; }
我预计输出应该是:40.8万,而我只有4.00000000
有没有办法让点后的数字
使用atof()
或strtof()
*代替:
printf("float value : %4.8f\n" ,atof(s)); printf("float value : %4.8f\n" ,strtof(s, NULL));
http://www.cplusplus.com/reference/clibrary/cstdlib/atof/
http://www.cplusplus.com/reference/cstdlib/strtof/
-
atoll()
是为了整数。 -
atof()
/strtof()
用于浮点数。
你只有4.00
的原因是因为当它find第一个非数字时停止parsing。
*注意strtof()
需要C99或C ++ 11。
不幸的是,没有办法轻松做到这一点。 每个解决scheme都有其缺点。
-
直接使用
atof()
或strtof()
:这是大多数人告诉你要做的事情,大部分时间都是这样。 但是,如果程序设置语言环境,或者它使用设置语言环境的库(例如,显示本地化菜单的graphics库),并且用户将其语言环境设置为小数点分隔符不是的语言.
(如fr_FR
分隔符所在的位置),这些函数将停止parsing.
你会得到4.0
。 -
使用
atof()
或strtof()
但改变语言环境; 这是一个调用setlocale(LC_ALL|~LC_NUMERIC, "");
之前任何电话atof()
或类似的。setlocale
的问题是这个过程是全局的,你可能会干扰程序的其他部分。 请注意,您可以使用setlocale()
查询当前的语言环境,并在完成后恢复它。 -
编写你自己的浮点parsing例程。 如果您不需要高级function(如指数parsing或hex浮点数),这可能会相当快。
另外请注意, 4.08
值不能完全表示为浮点数。 你将得到的实际价值是4.0799999237060546875
。
为什么不应该使用函数atof()将string转换为double?
成功时,atof()函数将转换后的浮点数作为double值返回。 如果不能执行有效的转换,则函数返回零(0.0)。 如果转换后的值超出可表示值的范围,则会导致未定义的行为 。
参考: http ://www.cplusplus.com/reference/cstdlib/atof/
相反,使用函数strtod() ,它更健壮。
试试这个代码:
#include<stdio.h> #include<string.h> #include<stdlib.h> int main() { char s[100] = "4.0800"; printf("Float value : %4.8f\n",strtod(s,NULL)); return 0; }
您将得到以下输出:
Float value : 4.08000000
使用atof()
但是,这是不赞成使用,而不是:
const char* flt = "4.0800"; float f; sscanf(flt, "%f", &f);
http://www.cplusplus.com/reference/clibrary/cstdlib/atof/
atof()
对于失败和0.0
转换返回0
,最好不要使用它。
double x; char *s; s = " -2309.12E-15"; x = atof(s); /* x = -2309.12E-15 */ printf("x = %4.4f\n",x);
Main() { float rmvivek,arni,csc; char *c="1234.00"; csc=atof(c); csc+=55; printf("the value is %f",csc); }
通过使用sscanf,我们可以将string转换为浮点数。
#include<stdio.h> #include<string.h> int main() { char str[100] ="4.0800" ; const char s[2] = "-"; char *token; double x; /* get the first token */ token = strtok(str, s); sscanf(token,"%f",&x); printf( " %f",x ); return 0; }