字符串转为整数(阿里一面测试开发岗题目)

今天在现场写代码的时候遗漏了好些情况没考虑,注定和阿里无缘了。晚上重新写了写。

主要考虑以下情况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;
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值