一、函数介绍
原型
int atoi(const char *nptr);
二、使用atoi
三、使用发现
可以发现:会先过滤掉空格,还能识别正负号,当第一次遇到正负号了,后面没接着是数字就返回0,
如果+45 5aa 结果是45,说明前面识别了数字,如果后面被中断了,转换也就停止了
第一个不是数字也就返回0
四、模拟实现
int sign = 0;//作为合法与非法转换的标志
int My_atoi(const char* str)
{
int flag = 1; //做符号标识
long long ret = 0; //用来存储字符串转换的数字,存储数据比int大
while (*str == ' ') //跳过第一次出现的字符前的空格
{
str++;
}
if ( !(*str >= '0' && *str <= '9') && (*str!='-')&&(*str!='+') )//如果第一个字符不是数字,也不是正负号,直接返回0
return 0;
if (*str == '-') //如果第一个字符是负号,说明是负数
{
flag = -1;//flag赋值为-1
str++; //移动到符号,的下一位
if (*str >= '0' && *str <= '9')//如果符号位后面紧跟是数字,正常进行
{
ret = 0;
while (*str >= '0' && *str <= '9')
{
ret = ret * 10 + (*str - '0');// 字符的数字减 '0' ,就得到了这个字符代表的数字
str++;
}
if (*str == '\0') //如果str到了'\0'就是合法转化,否则是非法
sign = 1;
ret *= flag;// 将结果乘上符号标识
if (ret < INT_MIN) //如果比INT_MIN还要小,就只能返回INT_MIN
ret = INT_MIN;
return (int)ret ; //强制类型转换
}
else //如果符号位后面紧跟不是数字,就返回0,
return 0;
}
else //如果第一个字符是负号,说明是负数
{
flag = 1;
if(*str=='+')
str++; //如果有+ ,就移动到符号的下一位,没有+号,就不要
if (*str >= '0' && *str <= '9')//如果符号位后面紧跟是数字,正常进行
{
ret = 0;
while (*str >= '0' && *str <= '9')
{
ret = ret * 10 + (*str - '0');//字符数字减 '0' ,就得到了数字
str++; //移到下一位
}
if (*str == '\0') //如果str到了'\0'就是合法转化,否则是非法
sign = 1;
ret *= flag;
if (ret > INT_MAX) //如果比INT_MAX还要大,就只能返回INT_MAX
ret = INT_MAX;
return (int)ret; //强制类型转换
}
else //如果符号位后面紧跟不是数字,就返回0,
return 0;
}
}
int main()
{
char arr[20] = " 245 ";
int ret = My_atoi(arr);
if (sign == 1)
printf("合法转换:%d\n", ret);
else
printf("非法转换:%d\n", ret);
return 0;
}