字符串转换成整数-微软面试题

来源:互联网 发布:sql server 字段赋值 编辑:程序博客网 时间:2024/05/21 09:15

思路:每扫描到一个字符,我们把在之前得到的数字乘以10再加上当前字符表示的数字。

特殊处理:

1、 整数可能不仅仅只含有数字,还有可能以’+’或者’-‘开头,表示整数的正负。

2、 非法输入。由于输入的是指针,在使用指针之前,我们要做的第一件是判断这个指针是不是为空。如果试着去访问空指针,将不可避免地导致程序崩溃。另外,输入的字符串中可能含有不是数字的字符。每当碰到这些非法的字符,我们就没有必要再继续转换。

3、 溢出问题。由于输入的数字是以字符串的形式输入,因此有可能输入一个很大的数字转换之后会超过能够表示的最大的整数而溢出。

#include <iostream>#include <cstdlib>using namespace std;int StrToInt(char * str){long long num=0;//设为long long类型,防止溢出 int fu=1;//是否有负号,-1表示有,1表示没有 bool valid=false;if(str==NULL || *str=='\0') return -1;//不合法 ""等价于'\0',但''等价于NUL,对吗? =>后半句不对,''不是null,而是空字符 if(*str=='+'){str++;}else if(*str=='-'){fu=-1;str++;}if(*str=='\0') return -1;//只有"+"或"-",也是不合法的 while(*str!='\0'){if(*str>='0' && *str<='9'){num=num*10+fu*(*str-'0'); if((fu==1 && num>0x7FFFFFFF) || (fu==-1 && num<(signed int)0x80000000)){return  -2;//溢出 }str++; }else{return -1;//不合法 }}return num;}void Test(char * str){ int num=StrToInt(str); if(num==-1){cout<<"输入不合法"<<endl; }else if(num==-2){cout<<"溢出"<<endl; }else{cout<<num<<endl;} }int main(void){    Test(NULL);    Test("");    Test("123");    Test("+123");      Test("-123");    Test("1a33");    Test("+0");    Test("-0");    //有效的最大正整数, 0x7FFFFFFF    Test("+2147483647");        Test("-2147483647");    Test("+2147483648");    //有效的最小负整数, 0x80000000    Test("-2147483648");        Test("+2147483649");    Test("-2147483649");    Test("+");    Test("-");    return 0;}



阅读全文
0 0
原创粉丝点击