【算法】【将字符串转换成int】

之前还使用过递归来计算,不过现在已经记不起来了

#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));
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值