【atoi函数的功能:】将字符串转化成整形数
* 开始扫描字符串的后,跳过空白字符,直到遇到正负号或者数字的时候才开始转换,当再次遇到非数字或者字符 串‘\0’的时候停止转化,并将结果返回。
【atoi函数写的时候要注意的点:】
1).字符串前的空白
2). 字符串所表示数值的正负号
3). 结束条件,遇到非数字或者字符'\0'结束
4). 考虑溢出,分别与int值所能表示的最大(0x7fffffff)和最小值(0x8000000)进行比较
5). 考虑异常输入情况下,用全局变量value来标识,对于"+/-" "0" "+abc"需要进行区分
【现在我们开始来写这个函数】:
#include<stdio.h>
#include<ctype.h>
#define INT_MAX ((int)0x7FFFFFFF)
#define INT_MIN ((int)0x80000000)
int value= 1; //用作处理异常的全局变量
int my_atoi(const char* str)
{
int sign = 1; //用来标记负号
long long ret = 0; //用作最后的返回值
value = 0;
if(str == NULL) //先判断是不是空字符串
{
return 0;
}
while(isspace(*str) == 1) //判断是否有空格字符
{
str++;
}
if(*str == '-') //判断字符串是否负号
{
sign = -1;
str++;
}
if((*str == '-')||(*str == '+')) //判断字符串是否是从正负号开始的
{
str++;
}
if((*str<'0') && (*str>'9')) //字符串不符合正确的输出,异常,比如"+abc"
{
return 0;
}
value = 1;
while((*str>='0') && (*str<='9'))
{
ret = ret*10 + *str-'0';
if(((sign == 1) && (ret>INT_MAX)) ||
((sign == -1)&&(ret<INT_MIN)))
{
value = 0;
}
str++;
}
return (ret*sign);
}
void Funtest()
{
printf("value=%d\n",my_atoi("123456789"),value);
printf("value=%d\n",my_atoi("-123456789"),value);
printf("value=%d\n",my_atoi(" 123456789"),value);
printf("value=%d\n",my_atoi(" "),value);
printf("value=%d\n",my_atoi("12345678999999999999"),value);
printf("value=%d\n",my_atoi("-1234567899999"),value);
printf("value=%d\n",my_atoi("1absv"),value);
printf("value=%d\n",my_atoi("+abc"),value);
}
int main()
{
Funtest();
return 0;
}
你掌握了吗?