题目:把字符串转换为整数,也就是实现atoi()。
2、如何区分字符串为NULL时返回的0还是字符'0' 返回的0。
3、'+''-'号也要算合法输入,但是也得注意只有' +''-'号的情况;
4、除了'+''-'号外,'0'到'9'之外的数字也算 非法输入;
5、考虑溢出的请款,如果字符串过长,也就是数字过大后会造成 溢出;
也许想的还不够周全,但是至少的注意以上的这些情况。
具体实现代码:
类似还有itoa(),将整数数转化为字符串,相反的过程。此题虽然简单,但是就像高考一样,简单的题不一定能做对,能做对的不一定能得分。好吧,下面来看看一看应该注意的地方。
易错点:
1、判断字符串是否为 NULL的情况(这是对字符串处理最基本得需要注意的地方)。2、如何区分字符串为NULL时返回的0还是字符'0' 返回的0。
3、'+''-'号也要算合法输入,但是也得注意只有' +''-'号的情况;
4、除了'+''-'号外,'0'到'9'之外的数字也算 非法输入;
5、考虑溢出的请款,如果字符串过长,也就是数字过大后会造成 溢出;
也许想的还不够周全,但是至少的注意以上的这些情况。
具体实现代码:
#include <iostream>
using namespace std;
enum status{Valid=0,InValid,IsOverFlow};
int InputStatue=Valid; //1.注意输入为NULL;
int StrToIntCore(const char *strr,bool minus)
{
long long num=0;
while(*strr!='\0')
{
if(*strr>='0' && *strr<='9')//4.输入的字符在0-9之外;
{
int flag=minus?-1:1;//判断是正还是负;
num=num*10+flag*(*strr-'0');
if(!minus && num>0x7fffffff || minus && num<(signed int)0x80000000)
//5.判断溢出情况;最大的正数0x7fffffff;最小的负数0x80000000
{
InputStatue=IsOverFlow;
num=0;
break;
}
strr++;
}
else
{
num=0;
break;
}
}
if(*strr=='\0')
InputStatue=Valid;
return num;
}
int SteToInt(const char *str)
{
InputStatue=InValid;
long long num=0;
if(str!=NULL && str!='\0')
{
bool minus=false;//3.+-号的合法性;
if(*str=='+')//'+'
str++;
else if (*str=='-')//'-'
{
str++;
minus=true;
}
if(*str!='\0')
num=StrToIntCore(str,minus);
}
return (int)num;//返回的时候转换为int;
}
int main()
{
char *strg[7]={
"+453434",
"-342445353",
"5345734573487537257834",
"-5345734573487537257834",
"",
"+",
"0"
};
int num[7]={8,8,8,8,8,8,8};
for(int i=0;i<7;i++)
{
num[i]=SteToInt(strg[i]);
switch(InputStatue)//2.返回0的判断是错误输入还是正常返回;
{
case 0:cout<<"the result is:"<<num[i]<<endl;
break;
case 1:cout<<"输入的数据有误!"<<endl;
break;
case 2:cout<<"数据转换溢出!"<<endl;
break;
}
}
system("pause");
return 0;
}
运行结果: