atoi
对于初学者来说大概率是一个陌生的函数
但不要害怕,我们可以通过各种网站去查询
例如:
cplusplus就是一个很好的查询网站
目录
- 函数介绍
- 模拟实现
- 需要注意的点
函数介绍
我们发现这是一个将字符串
转换为整形数字
的函数
例如:
int main()
{
char str[] = "1234";
int ret = atoi(str);
printf("%d\n", ret);
return 0;
}
在遇到不同字符串会有不同处理方法:
-
该函数首先根据需要丢弃尽可能多的空白字符(如在isspace中),直到找到第一个非空白字符。
-
从这个字符开始,接受一个可选的初始加号或减号,后面跟着尽可能多的以10为基数的数字,并将它们解释为数值。
-
字符串可以在组成整数的字符之后包含其他字符,这些字符将被忽略,并且对此函数的行为没有影响。
-
如果str中的第一个非空白字符序列不是有效的整数,或者由于str为空或仅包含空白字符而不存在这样的序列,则不执行转换并返回零。
模拟实现
模拟实现时我们就可以根据不同的处理方法进行操作
注意:
因为当你输入一个
“a”
时,输出为0
当输入一个“0”
时,同样为一个0
故需要进行判断是否为一个合法的或是非法的
可以运行enum
进行判断
#include<stdio.h>
#include<ctype.h>
#include<assert.h>
#include<stdlib.h>
//atoi模拟
enum Judge
{
VALID,
INVALID
}judge=INVALID;
int my_atoi(char* str)
{
assert(str);
//判断指针是否为NULL
int len = strlen(str);
//判断是否为空字符串
if (len == 0)
{
return 0;
}
//将空格跳过
while (isspace(*str))
{
str++;
}
//进行正负号的判断,注意如果原字符串可能不带符号,故初始化为1
int flag = 1;
if (*str == '+')
{
flag = 1;
//判断完正负号要进行++跳到下一个字符
str++;
}
else if(*str == '-')
{
flag = -1;
str++;
}
long long ret = 0;
//注意溢出
while (*str)
{
if (isdigit(*str))
{
ret = *str - '0' + ret * 10;
//计算新的ret的值的式子
if (ret > INT_MAX || ret < INT_MIN)
//判断是否超出int的最大范围
{
if (flag == 1)
return INT_MAX;
else
return INT_MIN;
}
str++;
}
else
return flag * ret;
}
//运行到这时肯定是合法的
judge = VALID;
return flag * ret;
}
需要注意的点
-
我经常性的写数组时忘记带
[]
,导致程序出错 -
在进行判别正负号时为了省事没有进行
'-'
判断,导致如果没有符号时程序出错
if (*str == '+')
{
flag = 1;
str++;
}
else
{
flag = -1;
str++;
}
欢迎纠错与改正