字符串转换成整数-微软面试题
2017-08-14 00:17
309 查看
思路:每扫描到一个字符,我们把在之前得到的数字乘以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;
}
特殊处理:
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;
}
相关文章推荐
- 微软,Google面试题 (17) —— 字符串转换成整数
- 18. 微软面试题:输入一个表示整数的字符串,把该字符串转换成整数并输出
- 2、微软面试题:输入一个表示整数的字符串,把该字符串转换成整数并输出
- 剑指offer 面试题49 把字符串转换成整数
- [程序员面试题精选100 题]17.把字符串转换成整数
- 剑指offer 面试题49 把字符串转换成整数
- 字符串转换成整数 【微软面试100题 第二十题】
- 面试题49 把字符串转换为整数
- 程序员面试题精选100题(17)-把字符串转换成整数[算法]
- 面试题49:把字符串转换成整数
- 把字符串转换成整数(2014年阿里巴巴实习生招聘面试题)
- 面试题49:把字符串转换成整数
- 【剑指offer】面试题67:把字符串转换成整数
- [剑指offer][面试题49]把字符串转换成整数(待完善)
- 面试题33:把字符串转换为整数
- 字符串转换成整数(微软面试)
- 【剑指Offer学习】【面试题49:把字符串转换成整数】
- 一道简单的面试题:字符串转换成整数(修正版)
- 《剑指Offer》面试题:将字符串转换为整数
- 常见C语言面试题之一:字符串代替、字符串转换整数