atoi函数的模拟实现
int atoi(const char *str);//将所指向的字符串转换为一个整型(int)
- 会跳过前面的空白字符。eg:( 123----输出123
- 遇到字母就会停下来。eg:123ab34-----输出123
- 会显示正负数。eg:(-123)-----输出(-123)
- 不能转换为int或者为空字符串会返回0eg: acd----输出0
- 越界会产生错误结果
int isspace(int c)如果判断字符是一个空白字符,则返回非零值ture,否则返回0(false
#include<stdio.h>
#include<assert.h>
#include<ctype.h>
#include<limits.h>//
//前面有空格会过滤掉
//遇到字母会停下来
//过大会报错
//会显示负数
//1.空指针
//2.空字符串
//3.空格
//+,-号
//非数字字符
//越界
//
enum Status
{
VALID,
INVALID
}sta=INVALID;//默认非法
int my_atoi(const char* str)
{
int flag = 1;
if (*str == '\0')
return 0;//非法0
//跳过空白字符
while (isspace(*str))//isspace()如果判断字符是一个空白字符,则返回非零值ture,否则返回0(false
{
str++;
}
//判断正负号
if (*str == '+')
{
flag = 1;
str++;
}
else if (*str == '-')
{
flag = -1;
str++;
}
long long ret = 0;//int的话越界那里存不下
while (*str != '\0')
{
if (isdigit(*str))//是数字界进入循环
{
//越界呢?
ret = ret * 10 + flag*(*str - '0');
//-12
// 0*10+(-1)*1=-1
// -1*10+(-1)*2=-12
//判断是否会越界
if (ret >INT_MAX || ret <INT_MIN)
{
return 0;
}
}
else
{
return (int)ret;
}
str++;//继续判断下一个字符
}
if (*str == '\0')
{
sta = VALID;
}
return (int)ret;
}
int main()
{
char arr[200] = "123";
int ret = my_atoi(arr);
if (sta == INVALID)
{
printf("非法返回:%d\n", ret);
}
else if (sta == VALID)
{
printf("合法转换:%d\n", ret);
}
return 0;
}