描述
C 库函数 int atoi(const char *str) 把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。
声明
下面是 atoi() 函数的声明。
int atoi(const char *str)
参数
str -- 要转换为整数的字符串。
返回值
该函数返回转换后的长整数,如果没有执行有效的转换,则返回零。
实例
模拟实现atoi函数:
断言判断指针是否为空。
检查我们的的字符串如果有空格就跳过(char arr[]=" -123a5"),就会跳过空格指向 '-' 号
判断‘-’ ‘+’两个符号如果为负就将flag赋值为负一,到最后return数字时再乘上负号即可 ( return (int)(n*flag) )
检查所传的字符是否是十进制数字字符,例如:“ -123a5” “a”即为非数字字符,就会停止,返回字符之前的数字字符的总值
0-9的ASCII码值为48-57 , 所以数字字符转化为数字有两种方法:
第一种:就是ASCII码值相减,题中为‘1’-‘0’
第二种:是‘1’-48=1
-123a5
n=1
n=1*10+2
n=12*10+3
5.检查我们所输出的数据是否会产生溢出
#include<stdio.h>
#include<assert.h>
#include<ctype.h>//(isspace,isdigit)
#include<limits.h>//INT_MAX INT_MIN
enum State
{
VALID,
INVALID
}; state = INVALID;//初始化为INVAILD 非法的
int my_atoi(const char* arr)
{
int flag = 1;
assert(arr != NULL);
if (*arr == '\0')//1.如果传过来的字符串为空,就返回0
{
return 0;
}
while (isspace(*arr))//2.isspace函数可以检查字符,如果为空白字符,
{ //返回非零值,否则返回0
arr++;
}
if (*arr == '-')//3.判断字符串中的‘-’号
{
flag = -1;
arr++;
}
if (*arr == '+')//4.判断字符串中的‘+’号
{
flag = 1;
arr++;
}
long long n = 0;//为防止数过大无法用long存储,会导致后边无法检测出是否溢出,所以用long long型
while (*arr != '\0')
{
if (isdigit(*arr))//5.isdigit函数检查所传的字符是否是十进制数字字符,
{ //如果 c 是一个数字,则该函数返回非零值,否则返回 0
n = n * 10 + (*arr - '0');//0-9的ASCII码值为:48-57,所以转化可以用两字符相减
if (n > INT_MAX || n < INT_MIN)//6.检查我们所输出的数据是否会产生溢出
{ //大于2^32-1或者小于-2^31就会溢出
return 0;
}
}
else//如果不是数字字符,直接跳出循环,字符串不合法(里边含有非字符)
{
break;
}
arr++;
}
if (*arr == '\0')//当字符串中所有的字符都检测完,说明该字符串全是合法的
{
state = VALID;
}
return (int)(n*flag);
}
int main()
{
char arr[] = " -123a5";
int n = my_atoi(arr);
if (state = VALID)
{
printf("合法转化:n=%d\n", n);
}
else
{
printf("非法转化:n=%d\n", n);
}
return 0;
}