解释:
atoi函数:把整数字符串转换为一个整数
规则:
如果是空字符串则直接返回0;
开始如果遇到空格一直往后读取,直到遇到非空字符;如果遇到的第一个非空字符既不是数字也不是正负号
当遇到负号,则代表atoi函数的返回值是负数;
继续往后读取,如果正负号后面遇到的是非数,直接返回0;
如果遇到的是数字,则一直存入某个空间;
直到读取到非数或者‘\0’,则返回某个空间里的那个数;
函数定义:
int atoi (const char * str);
代码&详解
#define _CRT_SECURE_NO_WARNINGS
#include<string.h>
#include <stdio.h>
#include<assert.h>
#include<ctype.h>
#include <limits.h>
enum Status
{
valid,
invalid
};
enum Status status = valid;//初始化为合法;全局变量status;
enum FLAG
{
flag1 = 1,
flag2=-1
};
enum FLAG flag = flag1;
int my_atoi(const char*str)//返回值类型为整形;
{
//1.空指针问题
assert(str);
//2.字符串为空的情况
if (*str=='\0')
{
return 0;
}
//3.首字符为空格的情况;
while (isspace(*str))
//isspace函数遇到空格,制表符,换行符等返回非零,否则返回零;头文件为<ctype.h>
{
//此处循环意思是遇到空格就一直跳过,直到遇到一个非空格的字符;
str++;
}
//4.正负问题
if (*str=='+')
{
str++;
}
if (*str=='-')
{
flag = flag2;
str++;
}
int n = 0;//创建一个变量n接收字符串转换为整数的值;
while (*str!='\0')
{
if (isdigit(*str))
//isdigit函数意为检查字符是否是(0-9),符合条件返回1,否则返回0;头文件为<ctype.h>
{
n = n * 10 + (*str-'0');//算法;
//溢出问题
if (n > INT_MAX)
{
return INT_MAX;//INT_MAX代表整型的最大值;头文件为<limits.h>
break;//跳出循环
}
if (n < INT_MIN)
{
return INT_MIN;//INT_MIN代表整型的最小值;头文件为<limits.h>
break;
}
}
else
{
status = invalid;//遇到字符,非法输出的情况;
return n * flag;
}
str++;
}
if (*str == '\0')
{
return n * flag;
}
}
int main()
{
const char* str = " -18-5a45";
int ret=my_atoi(str);//用整形接收;
if (status==valid)
{
printf("合法输出:%d", ret);
}
else
{
printf("非法输出:%d", ret);
}
return 0;
}
结果截图
![](https://i-blog.csdnimg.cn/blog_migrate/ac0447c63e8174d936c96e4aede0352d.png)