微软面试题——字符串转换成double类型数字
2012-07-26 20:43
561 查看
前一段时间看到微软亚洲工程院中国创新组招收软件开发实习生的题目:
编写一段C程序,C函数原型如下所示:
double stol(const char * str);
该函数接收一个C风格字符串,然后将其转化为对应的double数值。
为了简便,这里假设str总是一个合法的数值字符串,而且不需要考虑1.03e+24这种科学表示法的数值字符串。
在网上查了一下,把字符串转换为整形的C语言程序倒是有好多,而似乎把字符串转换为否点数的程序基本上没有。下面贴出我写的程序,望大家指正。
编写一段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-308 double 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; }
相关文章推荐
- 面试题--两个字符串数字相加,不能用jdk自带的类型转换方法
- php面试题 数字字符串如何转换成整数类型
- 【VB.NET机房重构】从字符串到类型double的转换无效?
- winCE下字符串转换为double类型
- 字符串转换成float和double类型
- 最近听到一个面试题,将数值型字符串转换成int类型
- int类型转换成字符串和字符串转换成int类型以及在MFC静态文本框显示数字的方式方法
- 数字类型和字符串类型的相互转换
- JAVA中数字类型与字符串之间的转换
- C# 的数据类型转换 c#字符串转换格式 c#日期数字字符串整形格式转换
- 字符串:怎样转换字符串为数字类型?
- 十位以上长整型或double类型数强制转换为16进制字符串
- double类型转换为字符串, 整型转换为字符串
- Angularjs 双向绑定时字符串的转换成数字类型的问题
- JavaScript中关于parseInt(),Number(),parseFloat()以及一元运算符“+”将字符串类型转换为数字类型的对比
- VB.NET -从字符串“xxx”到类型“Double”的转换无效
- 字符串转换成double类型
- 字符串:怎样将数字类型转换为字符串
- Number类为数字到字符串的类型转换场景定义三种方法
- 将数字类型转换为字符串