输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串“12345”,则输出整数“12345”。
本题看似很简单,依次扫描字符串,对于每次扫描到的字符,把在之前得到的数字乘10再加上当前字符表示的数字值即可。但是如果把所有特殊情况都考虑进去并分别给出处理,也不是非常容易的。
考虑以下测试用例:
1 考虑数字的符号:输入字符串为正数,负数,0。
2 考虑溢出。 考虑待处理数据的最大上界与最小下界。若用int保存(32位),则为0x7FFFFFFF与0x10000000(signed int)
3 若为异常输入。包括输入字符串为NULL指针,输入字符串为空字符,输入字符串中有非数字字符。
代码如下:
#include "stdafx.h"
#include <iostream>
enum Status {kValid = 0,kInvalid};
int g_nStatus=kInvalid;
using namespace std;
long long StrtoIntCore(const char* digit,bool minus)
{
long long int num=0;
while((*digit)!='\0')
{
if((*digit)>='0'&&(*digit)<='9')
{
int flag;
if(minus) flag=-1;
else flag= 1;
num=num*10+(flag)*((*digit)-'0');
if(((!minus)&&(num>0x7FFFFFFF))||((minus)&&(num<(signed int)0x80000000)))
{
num=0;
break;
}
digit++;
}
else
{
num=0;
break;
}
}
if(*digit=='\0')
{
g_nStatus=kValid;
}
return num;
}
int StrtoInt(const char* str)
{
g_nStatus=kInvalid;
long long num=0;
if(str!=NULL&&(*str)!='\0')
{
bool minus =false;
if(*str=='+')
{
str++;
}
else if(*str=='-')
{
minus=true;
str++;
}
if(*str!='\0')
{
num=StrtoIntCore(str,minus);
}
}
return (int) num;
}
int _tmain(int argc, _TCHAR* argv[])
{
//char s[]="1234567";
//char s[]="-123456789";
//char s[]="0";
//char s[]="123456789123456789";
char s[]="-12345678";
//char* s=NULL;
//char s[]="-dlakjl";
int num=0;
num=StrtoInt(s);
cout<<"num= "<<num<<endl;
return 0;
}