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();

}

 

posted @ 2020-02-11 11:53  jasmineTang  阅读(125)  评论(0)    收藏  举报