C++-STL(15)-string-int-整数字符串- 整数值

    把整数字符串转换成整数值。分两部分。
1.判断字符串以下四种为无效。
    1.1三种开头,以“_”长度为1;
    1.2不以"_",也不以数字开头:
    1.3“A12”;以0开头"023";
    1.4 每个字符 判断是否为数字 <‘0’或者>‘9’
2.转换 
   2.1符号单独存
   2.2绝对值以负数形式出现 :32位 整形 -2147483648   2147483647 负绝对值>正绝对值
 
 2.3溢出判断:一边遍历,一边做<minq的判断。
                          res<minq  溢出
                         res==minq  cur<minr  -> res+cur 肯定溢出
                         
上代码:
 

//给一个整数string 转换成Int
//不能以_或者0开头
//三种开头 _ !_ 0
//非数字 <0 >9

bool isValid(string strarr)
{
	if ((strarr[0] != '_') && ((strarr[0] < '0') || (strarr[0] > '9')))//      不以 _开头  且为数字
	{
		return false;
	}
	if ((strarr[0] == '_') && ((strarr.length() == 1) || (strarr[1] == '0'))) 以 _开头  且 长度1 或者后面跟0
	{
	   return false;
	}
	if (strarr[0] == '_' && strarr.length() > 1)                               // 以 _开头  且 长度1 或者后面跟0
	{
	   return false;
    }
	for (int i = 1; i < strarr.length(); i++)
	{
		if (strarr[i]<'0' || strarr[i]>'9')
		{
			return false;
		}
	}
	return true;

}
int convert(string strarr)
{
	if (strarr == ""||strarr._Equal(""))
	{
		return 0;                           //不能转
	}
	if (!isValid(strarr))                   //有效性
	{
		return 0;
	}
	bool posi = strarr[0] == '-' ? false : true;   //1.符号单独存
	int minq = INT32_MIN/10;
	int minr = INT32_MIN%10;

	int res = 0;
	int cur = 0;
	for (int i = posi ? 0 : 1; i < strarr.length(); i++)
	{
		cur = '0' - strarr[i];
		if ((res < minq) || (res == minq && cur < minr))//2.溢出两个判断条件1 <minq 2.res<miq cur<minr   前面< 后续< 
		{
			return 0;
		}
		res = res * 10 + cur;
	}
	if (posi && res == INT32_MIN)
	{
		return 0;
	}
	return posi ? -res : res;

}

void string2char_test()
{
	cout<<"123  返回   ********"<< convert("123")<<endl;
	cout << "023  返回0   ****" << convert("123") << endl;
	cout << "A23  返回0   ******" << convert("A23") << endl;
	cout << "2147483647  返回2147483647********" << convert("2147483647") << endl;
	cout << "-123  返回-123*******" << convert("-123") << endl;
	cout << "2147483648  溢出返回0************" << convert("2147483648") << endl;
	
}



void str2int_main()
{
	cout<<"*******str2int*******"<<endl;
	string2char_test();

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值