之前还使用过递归来计算,不过现在已经记不起来了
#include <stdio.h>
#include <error.h>
#include <math.h>
#define ERROR -22
#define DEBUG 0
static int CheckValid(char *str)
{
// debug
#if DEBUG
printf("%s\n", str);
#endif
// 鲁棒性为第一位考虑
if(str==NULL)
goto err;
char *ptr = str;
if(!(*ptr=='-'||((*ptr-'0')>=0&&(*ptr-'0'<=9)))){
goto out;
}
ptr++;
while(*ptr){
if(!((*ptr-'0')>=0&&(*ptr-'0'<=9))){
goto out;
}
ptr++;
}
return 0;
out:
fprintf(stderr, "%s is invalid\n", str);
err:
return ERROR;
}
static long int CharTolong(char *str)
{
// debug
#if DEBUG
printf("%s\n", str);
#endif
long int ret = 0;
int flag = 0;
int max = pow(2,(sizeof(int)*8)-1)-1;
int min = pow(2,(sizeof(int)*8)-1)*-1;
#if DEBUG
printf("max is %d\n", max);
printf("min is %d\n", min);
#endif
char *ptr = str;
if(*ptr=='-'){
flag = 1;
ptr++;
}
while(*ptr){
ret = ret*10+(*ptr-'0');
if(flag==1&&ret>(max+1))
return ERROR;
if(flag==0&&ret>max)
return ERROR;
ptr++;
}
if(flag==1)
ret *=-1;
return ret;
}
int main()
{
char str1[] = "2345";
if(!CheckValid(str1)){
int ret_str1 = CharTolong(str1);
if(ret_str1!=ERROR||ret_str1==ERROR&&strcmp(str1,"-22")==0)
printf("%ld\n", CharTolong(str1));
}
char str2[] = "-456";
if(!CheckValid(str2)){
int ret_str2 = CharTolong(str1);
if(ret_str2!=ERROR||ret_str2==ERROR&&strcmp(str2,"-22")==0)
printf("%ld\n", CharTolong(str2));
}
char str3[] = "0678";
if(!CheckValid(str3)){
int ret_str3 = CharTolong(str3);
if(ret_str3!=ERROR||ret_str3==ERROR&&strcmp(str3,"-22")==0)
printf("%ld\n", CharTolong(str3));
}
char str4[] = "gy789";
if(!CheckValid(str4)){
int ret_str4 = CharTolong(str4);
if(ret_str4!=ERROR||ret_str4==ERROR&&strcmp(str4,"-22")==0)
printf("%ld\n", CharTolong(str4));
}
char str5[] = "890-8";
if(!CheckValid(str5)){
int ret_str5 = CharTolong(str5);
if(ret_str5!=ERROR||ret_str5==ERROR&&strcmp(str5,"-22")==0)
printf("%ld\n", CharTolong(str5));
}
}