字符串转换为整数”123“->123

时间:2023-03-09 00:03:08
字符串转换为整数”123“->123

字符串转换为整数”123“->123

题目描写叙述:

输入一个由数字组成的字符串。把它转换成整数并输出。

比如:输入字符串"123"。输出整数123。

给定函数原型
int StrToInt(const char *str)
。实现字符串转换成整数的功能。不能使用库函数atoi。

题目分析:

将字符串正确转化为整数步骤

①当扫描第一个字符‘1’时候,因为为第一位。所以直接得到数字1

②当扫描第二个字符‘2’时候,1*10+2 = 12

③继续扫描字符‘3’时候,12*10+3=123

所以就是n = n * 10 + c;

易错处:

1)不能为空指针。否则訪问空指针时程序会崩溃if(str == NULL)return 0;

2)要考虑正负符号增加sign标记

3)要考虑非法字符。比如空格之类的while(isspace(*str)) ++str 还须要检測当为数字时,我们才開始转化

4)整型的溢出。假设输入一个非常长非常长的字符串,可能照成整型的溢出方法一、能够将n定义为long long型;方法二、利用定义MAX_INT 和 MIN_INT(对0右移取反),通过比較n和MAX_INT/10的大小

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

參考代码:

int StrToInt(const char *str)
{
//对0取反再右移一位
static const int MAX_INT = (int)((unsigned)~0 >> 1);
static const int MIN_INT = -(int)((unsigned)~0 >> 1)-1;
unsigned int n = 0; //推断是否为空
if(str == NULL)
return 0;
//处理空格
while(isspace(*str))
++str; //处理正负
int sign = 1;
if(*str == '+' || *str == '-')
{
if(*str == '-')
sign = -1;
++str;
} //确定数字后才開始转化
while(isdigit(*str))
{
//处理溢出
int c = *str - '0';
if(sign > 0 && (n > MAX_INT/10 || (n == MAX_INT/10 && c > MAX_INT%10)))
{
n = MAX_INT;
break;
}
else if(sign < 0 && (n > (unsigned)MIN_INT/10 || (n == (unsigned)MIN_INT/10 && c > (unsigned)MIN_INT%10)))
{
N = MIN_INT;
break;
} n = n * 10 + c;
++str;
}
return sign > 0 ? n : -n;
}