函数简介
atoi (表示 ascii to integer)是把字符串转换成整型数的一个函数,应用在计算机程序和办公软件中。int atoi(const char *nptr) 函数会扫描参数 nptr字符串,会跳过前面的空白字符(例如空格,tab缩进)等。如果 nptr不能转换成 int 或者 nptr为空字符串,那么将返回 0 。特别注意,该函数要求被转换的字符串是按十进制数理解的。atoi输入的字符串对应数字存在大小限制(与int类型大小有关),若其过大可能报错-1。
官方案例:
/* atoi example */
#include <stdio.h> /* printf, fgets */
#include <stdlib.h> /* atoi */
int main ()
{
int i;
char buffer[256];
printf ("Enter a number: ");
fgets (buffer, 256, stdin);
i = atoi (buffer);
printf ("The value entered is %d. Its double is %d.\n",i,i*2);
return 0;
}
引自:atoi_百度百科 atoi - C++ Reference
函数模拟
要基本模拟atoi函数首先要解决一下这些基本的问题
//空指针//空字符串//空白字符//正负号 //非数字字符//溢出 ,而且还要按照顺序来解决。
这时我们要引入两个函数
isspace 如果他的参数符合下列条件就返回真 : 空白字符:空格‘ ’,换页‘\f’,换行'\n',回车‘\r’,制表符'\t'或者垂直制表符'\v'
isdigit 如果他的参数符合下列条件就返回真 : 十进制数字 0~9
#include <assert.h>
#include <ctype.h>
#include <stdio.h>
enum Ststus
{
VALIT,
INVALIT
}status = INVALIT;
int my_atoi(char* arr)
{
int flag = 1;
//flag要置为一,否则如果没有下面正负号影响的话置成别的影响结果
//空指针
assert(arr);
//空字符串
if (*arr == '\0')
{
return 0;
}
//空白字符
while (isspace(*arr))
{
arr++;
}
//正负号
if (*arr == '+')
{
flag = 1;
arr++;
}
else if (*arr == '-')
{
flag = -1;
arr++;
}
long long n = 0;
//我们要定义一个比int类型更大的数字来判断int是否溢出
while (*arr)
{
if (isdigit(*arr))
//检查十进制数字0~9 如果是返回为真
{
n = n * 10 + flag*(*arr - '0');
//检查溢出
if (n < INT_MIN)
{
n = INT_MIN;
break;
}
else if(n > INT_MAX)
{
n = INT_MAX;
break;
}
}
else
{
break;
}
arr++;
}
if (*arr == '\0')
{
status = VALIT;
//如果字符串正常,到这里应该把状态置成VALIT(有效的)
}
return (int)n;
}
int main()
{
char arr[100] = " -12341";
int ret = my_atoi(arr);
if (status == VALIT)
{
printf("正常转化: %d\n", ret);
}
else
{
printf("非法转化: %d\n", ret);
}
return 0;
}
测试结果: