面试题1:把一个字符串转换成数字
2014-06-14 14:30
405 查看
1题目分析:
构思过程:
分析方法:写代码前想好测试用例,考虑所有可能的输入,并做相应的处理。这样的程序才有健壮性!
测试用例:char *p[8]={"123","123.45","A123.45","-123.45","+123.45","12A.45","123.A5",NULL};//测试用例
保证所有异常输入是返回0,正常输入时,转换为数字。
基本思路:
1.用Char*实现
空指针判断--变量定义--符号判断--整数部分--是否包含小数部分-小数部分--符号判断--返回值。(注意全程关于异常的判断)
2.用string实现
总结越简单的问题越要考虑全面,保证所有可能的输入,程序都能正常的处理!
构思过程:
分析方法:写代码前想好测试用例,考虑所有可能的输入,并做相应的处理。这样的程序才有健壮性!
测试用例:char *p[8]={"123","123.45","A123.45","-123.45","+123.45","12A.45","123.A5",NULL};//测试用例
保证所有异常输入是返回0,正常输入时,转换为数字。
基本思路:
1.用Char*实现
空指针判断--变量定义--符号判断--整数部分--是否包含小数部分-小数部分--符号判断--返回值。(注意全程关于异常的判断)
#include "stdafx.h" #include <iostream> #include <string> using namespace std; //-------------------------------------------------------------------char str_to_num double str_to_num(char *p1) { double num1=0,num2=0;//变量定义 char flag='+'; if (p1==NULL)//空指针判断及符号判断 { return 0; } else if (*p1=='-') { flag='-'; ++p1; } else if (*p1=='+') { ++p1; } else if (*p1>'9'||*p1<'0') { return 0; } char *p2=p1+strlen(p1)-1;//尾指针 while(*p1!='.'&&*p1!='\0')//整数部分 { if (*p1>'9'||*p1<'0') { return 0; } num1=num1*10+*(p1++)-'0'; } if (*p1=='\0') { return num1; } while(*p2!='.') //小数部分 { if (*p2>'9'||*p2<'0') { return 0; } num2=num2/10+*(p2--)-'0'; } num2/=10; if (flag=='-') { return -(num1+num2); } else return num1+num2; } int main() { char *p[8]={"123","123.45","A123.45","-123.45","+123.45","12A.45","123.A5",NULL};//测试用例 double result[8]={0}; double *p1=&result[0]; double *p2=p1,*p3=p1; for (int i=0;i<8;++i) { result[i]=str_to_num(p[i]); if (p[i]==NULL) { cout<<result[i]<<endl; } else cout<<p[i]<<" : "<<result[i]<<endl; } system("pause"); return 0; }
2.用string实现
double str_to_num(string str) { double num1=0,num2=0; char flag='+'; int int_index=0; if (str.empty()) { return 0; } else if (str[int_index]=='-') { flag='-'; int_index++; } else if (str[int_index]!='+'&&(str[int_index]>'9'&&str[int_index]<'0')) { return 0; } else if (str[int_index]=='+') int_index++; while(int_index!=str.size()&&str[int_index]!='.' )//容易溢出 { if (str[int_index]>'9'||str[int_index]<'0') { return 0; } num1=num1*10+str[int_index++]-'0'; } if (int_index==str.size()) { return num1; } int j=str.size()-1; while(str[j]!='.') { if (str[j]>'9'||str[j]<'0') { return 0; } num2=num2/10+str[j--]-'0'; } num2/=10; if (flag=='-') { return -(num1+num2); } else return num1+num2; } int main() { string a[7]={"123","123.45","A123.45","-123.45","+123.45","12A.45","123.A5"};//测试用例 double result[7]; for (int i=0;i<7;++i) { result[i]=str_to_num(a[i]); cout<<a[i]<<" : "<<result[i]<<endl; } system("pause"); return 0; }
总结越简单的问题越要考虑全面,保证所有可能的输入,程序都能正常的处理!
相关文章推荐
- 面试题1:把一个字符串转换成数字
- 一个把十六进制字符串转换为十进制数字的函数
- 微软面试题——字符串转换成double类型数字
- 18. 微软面试题:输入一个表示整数的字符串,把该字符串转换成整数并输出
- 编写一个函数,将一个数字字符串转换成该字符串对应的数字(包括正整数、负整数)
- 将一个整数(数字或长字符串形式)转换成中文输出
- 在IDL中识别一个字符串是否可以转换为double数字的函数IsDoubleString
- 用指针将一个字符串 转换为数字
- C习题:应用递归算法,将一个int型整数转换为数字字符串。如123转换为“123”
- 把一个“十六进制”字符串转换为十六进制数字输出
- 编写一个函数,将一个数字字符串转换成这个字符串对应的数字(包括正浮点数、负浮点数)
- 在delphi中Val是一个将字符串转换为数字的函数
- Haskell读入一个字符串,把它转换成数字
- 把一个字符串通过递归转换成相应数字
- 写一个 C 函数,该函数将给定的一个字符串转换成数字
- 2、微软面试题:输入一个表示整数的字符串,把该字符串转换成整数并输出
- 网友面试题:C#,不使用任何Parse,TryParse,Convert方法,自写函数将数字字符串转换成整数
- 一个数字转换成16进制数字表示的字符串
- 一道面试题 不用long的相关api将数字字符串转换成long
- 最近听到一个面试题,将数值型字符串转换成int类型