函数介绍
atoi函数的功能:分析 C 字符串 str,将其内容解释为整数,该整数作为 int 类型的值返回。
该函数首先根据需要丢弃尽可能多的空格字符,直到找到第一个非空格字符。
然后,从此字符开始,取一个可选的initial plus or minus ,后跟尽可能多的 10 进制数字,并将它们解释为数值。
字符串可以在构成整数的字符之后包含其他字符,这些字符将被忽略,并且对此函数的行为没有影响。
如果 str 中的第一个非空格字符序列不是有效的整数,或者由于 str 为空或仅包含空格字符而不存在此类序列,则不执行转换并返回零。
Return Value:int
逐步实现
- 如果 str 为空,不执行转换并返回零 👉
*str=='\0'
if ('\0' == *str)//str为空 → 不执行转换并返回零
{
return 0;
}
- 丢弃尽可能多的空格,去寻找第一个非空字符
while (isspace(*str))//丢弃尽可能多的空格字符
{
str++;
}//当寻找到第一个非空字符之后跳出循环
- 找到第一个非空字符之后处理正负号
int flag = 1;//标记正负号
if ('-' == *str)
{
flag = -1;
str++;
}
- 处理数字字符
- 拿一个
long long
类型的变量num
接收转换后的字符 👉 因为转换后的数值可能发生越界
long long num = 0;//用于接收转换后的数字
if (num<INT_MIN || num>INT_MAX)
return 0;//“负”越界或“正”越界
- 数字字符的数值=‘字符本身’ - ‘0’
num = num * 10 + flag * (*str - '0');
例如:“-123”
👉 num = 0×10+(-1)×(‘1’-‘0’)= -1
👉 num = -1×10+(-1)×(‘2’-'0) = -10+(-2) = -12
👉 num = -12×10+(-1)×(‘3’-‘0’) = -120 + (-3) = -123
- 继续往后走,跳出循环的两种可能:找到字符串的末尾’\0’,或者遇到非有效的数字字符(字符串可以在构成整数的字符之后包含其他字符,这些字符将被忽略,并且对此函数的行为没有影响。)
if ('\0' == *str)//跳出循环的第一种可能 → 转换数字成功
{
status = valuable;//代表合法的转换
return (int)num;
}
if (!isdigit(*str))//跳出循环的第二种可能 → 遇到非数字字符 or 找到的第一个非空字符不是有效的数字字符
{
return (int)num;//构成整数的字符之后包含其他字符将被忽略
}
ps.枚举变量enum Status status只是用于判断是合法转换还是异常转换,这里定义当且仅当所给字符串不为空且除有效数字字符外仅含有空格字符的情况才能被合法转换。atoi函数本身无法判断是否合法转换。
完整源码
//模拟实现atoi
#include <stdio.h>
#include <ctype.h>
#include <limits.h>
#include <assert.h>
enum Status
{
valuable,
invaluable
}status;
status = invaluable;
int My_atoi(const char* str)
{
assert(str);
if ('\0' == *str)//str为空 → 不执行转换并返回零
{
return 0;
}
while (isspace(*str))//首先需要丢弃尽可能多的空格字符
{
str++;
}//当寻找到第一个非空字符之后跳出循环
int flag = 1;//标记正负号
if ('-' == *str)
{
flag = -1;
str++;
}
//处理数字字符
long long num = 0;//用于接收转换后的数字
while (isdigit(*str))
{
num = num * 10 + flag * (*str - '0');
if (num<INT_MIN || num>INT_MAX)
{
return 0;//“负”越界或“正”越界
}
str++;
}
if ('\0' == *str)//跳出循环的第一种可能 → 转换数字成功
{
status = valuable;//代表合法的转换
return (int)num;
}
if (!isdigit(*str))//跳出循环的第二种可能 → 遇到非数字字符 or 找到的第一个非空字符不是有效的数字字符
{
return (int)num;//构成整数的字符之后包含其他字符将被忽略
}
}
int main()
{
int a = My_atoi("1234d");
int c = My_atoi("ab12");
int d = My_atoi("");
int e = My_atoi(" -324");
printf("a=%d c=%d d=%d e=%d \n", a, c, d, e);
return 0;
}