今天在现场写代码的时候遗漏了好些情况没考虑,注定和阿里无缘了。晚上重新写了写。
主要考虑以下情况1.正负数;2.是否越界;3.是否存在非法字符;4.如果存在小数点,并且小数点后面都是数字,并不存在非法字符(非数字‘0’到‘9’),则必须考虑截断,返回整数
5.字符串前面存在空白字符;
详细程序如下:
#pragma once
#include <iostream>
#include <string>
using namespace std;
bool valid=true;//是否非法
int strToInt(const char *str);
int main(){
/*
char str=' ';
char str1='\0';
char str2=NULL;
char str3='0';
cout<<str+'0'<<" "<<str1+'0'<<" "<<str2+'0'<<" "<<str3+'0'<<endl;
*/
char *str1="-2147483648";//预测-2147483648,1 正确返回,正好为临界值
char *str2="-2147483649";//预测0,0 因为发生越界
char *str3="2147483647";//预测返回2147483647,1 正确返回,正好处于正数的临界值
char *str4="2147483648";//预测返回0,0 因为发生正数临界值越界
char *str5="4335asdfafd";//预测返回0,0 因为发生了非法字符
char *str6="888.999";//预测返回888,1
char *str7="888.999e";//预测返回0,0 因为出现了非法字符
int result1=strToInt(str1);
cout<<result1<<" "<<(bool)valid<<endl;
int result2=strToInt(str2);
cout<<result2<<" "<<(bool)valid<<endl;
int result3=strToInt(str3);
cout<<result3<<" "<<(bool)valid<<endl;
int result4=strToInt(str4);
cout<<result4<<" "<<(bool)valid<<endl;
int result5=strToInt(str5);
cout<<result5<<" "<<(bool)valid<<endl;
int result6=strToInt(str6);
cout<<result6<<" "<<(bool)valid<<endl;
int result7=strToInt(str7);
cout<<result7<<" "<<(bool)valid<<endl;
return 0;
}
int strToInt(const char *str){
valid=true;
bool minus=false;//用于标记是否负数
if(str==NULL){//字符串指针为空
valid=false;
return 0;
}
while(*str==' '){//处理字符串前可能存在的空白符
str++;
}
if(*str=='+'||*str=='-'){//判断字符串前是不是有‘+’或者‘-’
if(*str=='-'){
minus=true;
}
str++;
}
long long num=0;
int MinValue=-(1<<31); //负边界
int MaxValue=(1<<31)-1;//正边界
//cout<<MinValue<<" "<<MaxValue<<endl;
while(*str>='0'&&*str<='9'){
num=num*10+(*str-'0');
/*下面判断是否越界*/
if(minus==true){//负数情况
if(-1*num<MinValue){//超过负数临界值
valid=false;
return 0;
}
}else{//正数情况
if(num>MaxValue){//超过正数临界值
valid=false;
return 0;
}
}
str++;
}
if(*str=='.'){//考虑是否存在小数的情况,如果存在小数点,还必须判断后面的字符是否存在非法字符
str++;
while(*str>='0'&&*str<='9'){//小数点后面是合法字符
str++;
}
}
if(*str=='\0'){//判断此时字符串是否处理结束,如果结束,则返回正确值
if(minus){//负数
return (int)(-1*num);
}else{//正数
return (int)num;
}
}else{//后面还有相应的字符串,且为非法字符
valid=false;
return 0;
}
}