面向过程
bool isNumber(char a)
{
return (a>='0'&&a<='9');
}
int myAtoi(char * s){
int len=strlen(s);
int i=0;
int flag=1;
long long ans=0;
while(i<len){
while(s[i]==' ')
i++;
//空格后的第一个字符
if(s[i]=='+'){
//B
i++;//取下一个字符
if(isNumber(s[i])){
ans=10*ans+s[i]-'0';
//C
i++;//取下一个字符
while(isNumber(s[i])){
ans=10*ans+s[i]-'0';
if(ans>0x7fffffff)
{
ans=0x7fffffff;
printf("end\n");
printf("ans=ans\n",ans);
return flag*ans;
}
i++;
}
//C状态下接收到了非数字的字符,结束
printf("end\n");
printf("ans=%d\n",ans);
return flag*ans;
}
//B状态下接收到了非数字的字符,error
printf("error\n");
return 0;
}
if(s[i]=='-'){
//B
flag=-1;
i++;//取下一个字符
if(isNumber(s[i])){
ans=10*ans+s[i]-'0';
//C
i++;//取下一个字符
while(isNumber(s[i])){
ans=10*ans+s[i]-'0';
if(ans>0x80000000)
{
ans=0x80000000;
printf("end\n");
printf("ans=ans\n",ans);
return flag*ans;
}
i++;
}
//C状态下接收到了非数字的字符,结束
printf("end\n");
printf("ans=%d\n",ans);
return flag*ans;
}
//B状态下接收到了非数字的字符,error
printf("error\n");
return 0;
}
if(isNumber(s[i])){
printf("当前字符为%c\n",s[i]);
ans=10*ans+s[i]-'0';
//C
//C
i++;//取下一个字符
while(isNumber(s[i])){
ans=10*ans+s[i]-'0';
if(ans>0x7fffffff)
{
ans=0x7fffffff;
printf("end\n");
printf("ans=ans\n",ans);
return flag*ans;
}
i++;
}
//C状态下接收到了非数字的字符,结束
printf("end\n");
printf("ans=%d\n",ans);
return flag*ans;
}
//A状态下接收到了其他字符
printf("error\n");
return 0;
}
printf("end\n");
if(flag*ans>0x7fffffff)
{
ans=0x7fffffff;
}
else
{
if(flag=-1&&ans>0x80000000)
ans=0x80000000;
}
printf("ans=%d\n",ans);
return flag*ans;
}
改写之后的代码 “面向状态”
#define MIN(x,y) (x<y?x:y)
#define MAX(x,y) (x>y?x:y)
int flag ;
long long ans ;
void st_c(char* s, int i) {
if (i >= strlen(s))
{
ans = flag * ans;
return;
}
switch (s[i]) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
ans = ans * 10 + s[i] - '0';
if(flag*ans>INT_MAX)
{
ans=INT_MAX;
return;
}
if(flag*ans<INT_MIN){
ans=INT_MIN;
return;
}
st_c(s, i + 1);
break;
default:
ans = flag * ans;
break;
}
}
void st_b(char* s, int i) {
switch (s[i]) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
ans = ans * 10 + s[i] - '0';
st_c(s, i + 1);
break;
default:
ans=0;
break;
}
}
void st_a(char* s, int i) {
//状态a
switch (s[i]) {
case ' ':
st_a(s, i + 1);
break;
case '-':
flag = -1;
case '+':
st_b(s, i + 1);
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
ans = ans * 10 + s[i] - '0';
st_c(s, i + 1);
break;
default:
ans=0;
break;
}
}
int myAtoi(char * s){
ans=0;
flag=1;
st_a(s,0);
return ans;
}
再改动之后的版本
#define MIN(x,y) (x<y?x:y)
#define MAX(x,y) (x>y?x:y)
int flag ;
long long ans ;
void st_error(){
ans=0;
}
void st_done(){
ans=flag*ans;
}
void st_flow(){
ans=flag*ans;
ans=MIN(ans,INT_MAX);
ans=MAX(ans,INT_MIN);
}
void st_c(char* s, int i) {
switch (s[i]) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
ans = ans * 10 + s[i] - '0';
if(flag*ans>INT_MAX || flag*ans<INT_MIN)
{
st_flow();
return;
}
st_c(s, i + 1);
break;
case 0:
default:
st_done();
break;
}
}
void st_b(char* s, int i) {
switch (s[i]) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
ans = ans * 10 + s[i] - '0';
st_c(s, i + 1);
break;
default:
st_flow();
break;
}
}
void st_a(char* s, int i) {
//状态a
switch (s[i]) {
case ' ':
st_a(s, i + 1);
break;
case '-':
flag = -1;
case '+':
st_b(s, i + 1);
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
ans = ans * 10 + s[i] - '0';
st_c(s, i + 1);
break;
default:
st_flow();
break;
}
}
int myAtoi(char * s){
ans=0;
flag=1;
st_a(s,0);
return ans;
}