微软面试题——字符串转换成double类型数字
前一段时间看到微软亚洲工程院中国创新组招收软件开发实习生的题目:
编写一段C程序,C函数原型如下所示:
double stol(const char * str);
该函数接收一个C风格字符串,然后将其转化为对应的double数值。
为了简便,这里假设str总是一个合法的数值字符串,而且不需要考虑1.03e+24这种科学表示法的数值字符串。
在网上查了一下,把字符串转换为整形的C语言程序倒是有好多,而似乎把字符串转换为否点数的程序基本上没有。下面贴出我写的程序,望大家指正。
#include<stdio.h>#include<math.h>typedefint bool;#define true1#define false0#define MAXIMUM1.7E+308 //#define MINIMUM1.7E-308double stol(constchar *str){ bool sign=false; bool hasPoint=false; double valueBeforePoint=0.0; double valueAfterPoint=0.0; int deCount=0; //如果输入字符串的地址错误或者为空字符串 if(str==NULL||str[0]=='\0') { printf("invalid parameter!\n"); return 0; } int i=0; for(;str[i]!='\0';i++) { //判断第一个字符是否为符号 if(i==0&&(str[0]=='-'||str[0]=='+')) { if(str[0]=='-') sign=true; } else { //if(hasPoint==false&&i!=0&&str[i]=='.'&&hasSign) //判断是否有小数点,删除三种情况: //1.已经找到了一个小数点; //2.str[0]不能为小数点; //3.需要区分字符串的首个字符是否是正负号,如果有正负号,那么str[1]不能为小数点,否则可以。 if(hasPoint==false&&i!=0&&str[i]=='.'&&(str[0]!='-'||str[0]!='+')) hasPoint=true; else { if('0'<=str[i]&&'9'>=str[i]) { if(hasPoint==false) { valueBeforePoint=valueBeforePoint*10+str[i]-'0'; if(valueBeforePoint>MAXIMUM) { printf("out of range!\n"); return 0; } } else { valueAfterPoint=valueAfterPoint*10+str[i]-'0'; deCount++; } } else { printf("Input string isn't a double !\n"); return 0; } } } } //最终返回值为小数点前面的值加上小数点后面的值 valueBeforePoint=valueBeforePoint+valueAfterPoint/pow(10,deCount); return sign?(-1*valueBeforePoint):valueBeforePoint;}int main(){/* "" -->invalid parameter!//无效的参数 "-1234.0001" -->-1234.0001 //带有符号的正常浮点数 "+124." -->124 //结尾是小数点的字符串 "cab124" -->0 //字符串开头为字母 "12a23" -->0 //字符串既有数字又有字母 "123.234" -->123.234 //无符号的浮点数 "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"-->out of range!*/ char str[7][1000]={"","-1234.0001","+124." ,"cab124","12a23","123.234","111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"}; int i=0; for(;i<7;i++) { double valueOfStr=stol(str[i]); if(valueOfStr>0.0000001||valueOfStr<-0.0000001)//如果返回值不为0,即没有出现某种错误,那么就输出valueOfStr printf("%f\n",valueOfStr); } return 0;}