C++技巧(两种将字符串转换成浮点数的方法)

C++技巧(两种将字符串转换成浮点数的方法),第1张

C++技巧(两种将字符串转换成浮点数的方法),第2张

字符串转换成浮点数的两种方法
方法一:
charsztring[]= "-2843.000000000005
double db1;
db1 = atof(SZ string);
printf(" atof result:\ n ");
printf(" % f % . 12f % . 2f % E % E \ n ",db1,db1,db1,db1,db1);
printf(" % . 1e % . 1e % . 18e % . 18e \ n ",db1,db1,db1,db1);
方法二:
charsztring 2[]= "-2843.000000000804
double DB2;
sscanf(szString2," %lf ",& DB2);
printf(" \ NSS canf result:\ n ");
printf(" % f % . 12f % . 2f % E % E \ n ",db2,db2,db2,db2,DB2);
printf(" % . 1e % . 1e % . 18e % . 18e \ n ",db2,db2,db2,DB2);
这两种方法可以得到相同的输出!输出如下:
atof结果:
-2876.998124-2876430-2877.00-2.876998 e+003-2.87698 e+003
-2.9E+003-2.9E+003-2.87699812376430100 e+003想把sscanf家族函数的具体用法写出来,考一考。先看看这个家族的一些函数原型:
/从键盘输入数据到变量
int scanf(char *格式,...);
//从字符串向变量输入数据,如下
intsscanf(const char * buffer,constchar * format,...);
int _ sscanf _ l(const char * buffer,const char *format,locale_t locale,...);
int SWS canf(const wchar _ t * buffer,const wchar_t *format,...);
int _ SWS canf _ l(const wchar _ t * buffer,const wchar_t *format,locale_t locale,...);
下面我们就来看看标准的sscanf函数:
intsscanf(const char * buffer,constchar * format,...);
先说它的返回值。几乎所有的库函数都有返回值。有些人可能会感到惊讶。怎么这么少人用过sscanf的返回值?Sscanf将返回成功接收的变量个数的值。如sscanf("3.14159 "," %f ",& pi);返回值为1。
测试下面的程序:
# include
int main()
{
int a;
printf ("%d ",scanf("%d\n ",& a));
返回0;
}
如果在开头输入回车,程序会继续等待您的输入,因为输入数字时,scanf会跳过空白字符。根据编程语言,scanf实际上是用getchar()接受一串数字,然后转换成数字。如果我输入CTRL-Z(UNIX上的ctrl-d),它将返回-1(取决于编译器)。这其实就是常量e of的值,叫做返回eof。如果我输入一个数字,返回值是0。但是如果我输入浮点数会怎么样呢?我的例子也会返回1,但是缓冲区会留下垃圾,如果是scanf("%d%d ",&a,& b);会有一个错误。可以使用库函数fflush(stdin)来清除缓冲区。不过,雨里的闫飞姐好像说这种用法不规范。K&R,只是说行为是未定义的,但是我们可以使用while((c=getchar()))!='\n'&&c!= EOF);同样,下面垃圾scanf的格式匹配也可以清除掉,还是比较简单的。一定要记住,普通变量必须加&否则编译器无法检测到错误,但运算肯定会出错。
代码及含义
%a读取浮点值(仅C99)
% a读取浮点值(仅C99)
% c读取单个字符
%d读取十进制整数
%i读取十进制和八进制。%E读取浮点数
%f读取浮点数
%F读取浮点数(仅C99)
% G读取浮点数
%o读取八进制数
%s读取字符串
%%pRead指针值
% n目前读取的值的等效字符数
% u读取无符号十进制整数
%[]扫描字符集
% %读取前面很简单,% p,% n很少用。要输入%,必须在前面再加一个%。关注%s和% []。%s被读入数组。%s和gets的区别在于% s以任何空字符结束,而gets以回车结束。同样,您可以在%s前添加一个数字来表示有多少是只读的。ansi标准为scanf()添加了一个新功能,称为scanset。Set定义了一个字符集,它可以被scanf()读取并分配给相应的字符数组。集合由一对方括号中的字符串定义,其前面必须有一个百分号。例如,下面的扫描集使scanf()读取字符A、B和C:
% [ABC]
使用扫描集时,scanf()不断地吃掉集合中的字符,并将它们放入相应的字符数组中,直到找到不在集合中的字符(即扫描集只读取匹配的字符)。当返回时,以null结尾并由读入字符组成的字符串被放置在数组中。对于许多实现,连字符可以解释一个范围。例如,以下扫描集使scanf()接受字母A到Z:
% [a-z]
需要注意的是,扫描集区分大小写。所以要扫描大小写字母的时候,要把大小写字母分开说明。对于% [],还可以使用+任意字符(包括eof)来结束字符串的输入。例如,% [EOF]表示字符串不会停止,直到有EOF输入。但是一定要记住,C语言是一个缓冲输入,就算你% [a],你在enter enter之前输入多少个A都是不可能完成的。%s的输入会跳过空白字符,但%c不会。即
scanf("%d ",& h);
scanf("%c ",& c);
如果这样写,变量C必须放入回车。如果想实现这种输入,可以在两个语句之间加一个getchar()。他要么吃这个回车,要么用scanf("%d %c ",&h,& c);来,输入数字加空框。可以,但是千万不要使用scanf("%d\n ",& h);K&R说得很清楚,任何无格式字符都需要完全匹配。这意味着在输入数字后添加\n是合法的。任何项目前加*表示该项目与数值不符。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C++技巧(两种将字符串转换成浮点数的方法)

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情