最近在准备找工作,正在看剑指offer,看到一个简单的字符串转换为整数的题
现有可以实现的函数
1.
#include <stdlib.h>
int atoi( const char *str );
2.
sscanf(str,"%d",&num)
3.
#include<sstream>
char *str="123";
int num;
stringstream ss(str);
ss>>num;
其实挺简单的,但是考虑的要比较多
1.带符号的情况
2.含有不能转换为整数的字符
3.越界的情况
写了一小段代码,实现了功能,但是在逻辑上似乎并不十分的清晰,希望大家批评指正
#include "stdafx.h"
#include <iostream>
using namespace std;
bool str2int(const char *str,int &n)
{
bool negative=false;
int num=0,tempnum=0;
const char *strorigin=str;
if(str==NULL)
return false;
if(*str=='-')
{
negative=true;
str++;
}
if(*str=='+')
{
negative=false;
str++;
}
if(*str==0) //空字符串
return false;
if(strlen(str)>10) //最大2147483647 最小-2147483648 超过10位肯定越界
{
cout<<"error:字符串"<<strorigin<<"所表示的数字大于10位,超过int范围"<<endl;
return false;
}
while(*str!=0)
{
if(*str>='0'&&*str<='9')
{
num=10*num+*str-'0';
if(num<tempnum)
{
if(negative&&num==0x80000000)
{
n=num;
cout<<"success:"<<n<<endl;
return true;
}
else
{
cout<<"error:字符串"<<strorigin<<"所表示的数字过大,超过int范围"<<endl;
return false;
}
}
tempnum=num;
str++;
}
else
{
cout<<"error:字符串"<<strorigin<<"中包含非数字字符!"<<endl;
num=0;
return false;
}
}
if(negative)
n=num*(-1);
else
n=num;
cout<<"success:"<<n<<endl;
return true;
}
int _tmain(int argc, _TCHAR* argv[])
{
char *str1="-10";
char *str2=NULL;
bool flag;
int n=0xFFFFFFFF;
int n1=0x80000000;
//临界
flag=str2int("-2147483648",n);
flag=str2int("2147483647",n);
//越界
flag=str2int("2147483648",n);
flag=str2int("-2147483649",n);
flag=str2int("-2147483649345",n);
//正常
flag=str2int("0",n);
flag=str2int("-1000",n);
flag=str2int("1000",n);
flag=str2int(str2,n); //NULL
flag=str2int("",n); //空字符串
flag=str2int("12abc",n);
system("pause");
return 0;
}
运行结果: