题目描述
输入一个由数字组成的字符串,把它转换成整数并输出。例如:输入字符串"123",输出整数123。
给定函数原型int StrToInt(const char *str)
,实现字符串转换成整数的功能,不能使用库函数atoi。
思路:对于字符串“123”,计算过程是n = n*10 + c,其中,n是最后所求数字,c是当前数字,线性扫描即可
但是还需要考虑其他问题,一是空指针;二是符号问题,“+”,“-”;三是非法字符问题;四是整数溢出。
空指针直接退出,符号用sign表示,非法字符用isDigit()进行判断,对于整数溢出,
当整数发生溢出时,取最大或最小的int值,int的表示范围是MAX_INT:2147483647,MIN_INT:-2147483648。
判断n与MAX_INT和MIN_INT的关系,如果n>MAX_INT/10,那么n=n*10+c必然大于MAX_INT,如果n==MAX_INT,则判断c和MAX_INT%10的关系,如果c>MAX_INT%10,那么n=n*10+c>MAX_INT,对于MIN_INT,判断方法相似,只不过MIN_INT = -MAX_INT-1,需要单独判断
bool isDigit(char c)
{
if(c>='0' && c<='9')
return true;
return false;
}
bool isSpace(char c)
{
if(c == ' ')
return true;
return false;
}
int StrtoInt(const char *string)
{
const int MAX_INT = 2147483647;
const int MIN_INT = -2147483648;
unsigned int n = 0;
const char* str = string ;
while(isSpace(*str))
{
str ++;
}
bool sign = true;
if(*str == '-')
{
sign = false;
str++;
}else if(*str == '+')
{
str++;
}else if(isDigit(*str))
{
}else
{
return 0;
}
while(isDigit(*str))
{
int c = *str - '0';
if(sign && (n>MAX_INT/10 || (n==MAX_INT/10 && c > MAX_INT%10)))
{
return MAX_INT;
}
else if( !sign && (n>(unsigned)MIN_INT/10) || (n==(unsigned)MIN_INT/10 && c> (unsigned)MIN_INT%10))
{
return MIN_INT;
}else
{
n = n*10 +c;
str ++;
}
}
if(*str == '\0')
{
if(sign)
{
return n;
}else
{
return -1 * n;
}
}
return 0;
}
举一反三
- 实现string到double的转换《待续。。。》
分析:此题虽然类似于atoi函数,但毕竟double为64位,而且支持小数,因而边界条件更加严格,写代码时需要更加注意。