atoi
函数原型:int atoi(const char *nptr);
函数功能:atoi 是把字符串转换成整型数的一个函数,atoi函数会扫描参数 nptr字符串,跳过前面的空白字符(例如空格,tab缩进)等,可以通过isspace( )函数来检测),直到遇上数字或正负符号才开始做转换,而在遇到非数字或字符串结束符('\0')才结束转换,并将结果返回。如果 nptr不能转换成 int 或者 nptr为空字符串,那么将返回 0;
我们在模拟实现atoi时需要注意以下几点:
①首先是空格情况,如果遇到空格则跳过空格,继续向后,若全是空格,则返回0;
②遇到正负号,如果遇到‘+’或‘-’,先使用一个flag标记这个状态,最后在根据flag来判断转换后整数的正负;
③含有非数字字符,例如"12ac"、"#123"等,只要判断出字符串中含有此类字符则直接返回;
④无数字字符,字符串中没有数字字符,直接返回0;
⑤返回值,我们需要额外使用一个状态来标记函数返回值是正常返回,还是异常返回,原因在于,当我们输入0时会和那些异常返回混淆,因此增加一个状态标识异常;
⑥溢出情况,当字符串中的字符数字转换的整数太大或者太小,可以通过判断转换后的数字是否处于long的范围内。
以下给出代码:
//模拟实现atoi
#include<iostream>
#include<assert.h>
using namespace std;
bool stat = false;//用来判断结果是否正常
int my_atoi(const char* str)
{
int flag = 1;
long long ret = 0;
assert(str);
while (*str == ' ')
{
++str;
}
//判断是否到了结尾
if (*str == '\0')
return 0;
//判断正负
if (*str == '+')
++str;
else if (*str == '-')
{
flag = -1;
++str;
}
//读取数字
while (*str >= '0'&& *str <= '9')
{
ret = ret * 10 + flag*(*str - '0');
//判断异常
if (ret <= INT_MIN || ret >= INT_MAX)
break;
++str;
}
if (*str == '\0')
stat = true;
return (int)ret;
}
int main()
{
const char* str = "+12345 ";
int ret = 0;
ret=my_atoi(str);
if (stat == false)
cout << "异常"<<endl;
cout << ret << endl;
system("pause");
return 0;
}