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);//判断指针是否为NULLint len = strlen(str);//判断是否为空字符串if (len == 0){return 0;}//将空格跳过while (isspace(*str)){str++;}//进行正负号的判断,注意如果原字符串可能不带符号,故初始化为1int 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;elsereturn INT_MIN;}str++;}elsereturn flag * ret;}//运行到这时肯定是合法的judge = VALID;return flag * ret;
}
需要注意的点
-
我经常性的写数组时忘记带
[]
,导致程序出错 -
在进行判别正负号时为了省事没有进行
'-'
判断,导致如果没有符号时程序出错
if (*str == '+'){flag = 1;str++;}else{flag = -1;str++;}
欢迎纠错与改正