似乎过往良久了,如今才看见。起首你的那个代码是有问题的,准确代码如下:#includedoubleatof(chars[]){doubleval,power;inti,sign;for(i=0;isspace(s[i]);i++);sign=(s[i]=='-'?-1:1);if(s[i]=='+'||s[i]=='-')i++;for(val=0。
0;isdigit(s[i]);i++)val=10。0*val+(s[i]-'0');if(s[i]=='。')i++;for(power=1。0;isdigit(s[i]);i++){val=10。0*val+(s[i]-'0');power*=10。
0;}returnsign*val/power;}intmain(){charstr[10]={0};scanf("%s",str);printf("%lf
",atof(str));}问题除了你的书写上的遗漏,然后次要有两点逻辑上的问题。
我先给你说一下那个函数的思惟:就是把一个字符串转换成float类型,起首往除没必要要的空格,sign代表的就是那个转换出来的float类型的数据时正仍是负,正值成1,负值乘以-1;然后提取出有数字的部门并保留为整形,同时笔录小数点后有几位数字;最初用获得的整形数除以小数点所应该到的位数,如-123。
45,那么sign是-1,取出来的整形是12345,然后再除以100为123。45,再乘以-1就是转换后的float型数据了。你代码逻辑问题:1、val=10。0*val+val+(s[i]-'0');那句话应该是val=10。0*val+(s[i]-'0');目标就是把有数字的数搞成整形的(那个整形在那表达把字符串中有数字的放到小数点的左侧,因为val是个double,所以严厉说不是整形),好比12:刚起头val=0。
0,一次轮回后就是1。0,然后第二次轮回就是12。0了,每次乘以10就相当于把十进造的数字左移一位呗,增大十倍嘛;2、最初一个for轮回应该打上大括号,同时把power*=10。0;那句话括进往,表达把小数点后边的数字连同前边的数字整成一个整形数的时候乘了几次10(power/10就是小数点的位数),等最初再给除回来。
再详尽点就是:好比是12。350,第一次取值轮回完毕val=12,然后第二次取值轮回完毕val=12350,power=1000。0(乘了三次10),那么最初一句就是12350/1000。0=12。35。够详尽了吧。本身列一个数字,跟着代码走读一次,根据计算机运行的过程在脑海中运行一次就大白了~~~。