前言
atoi 函数主要功能是将一个字符串转变为整数,列如:”12345“->12345。但在实现过程中,我们会因为考虑不够全面而漏掉比较重要的几点
atoi的注意事项:
空指针问题
assert(arr); //判断是否是空指针
空字符串问题
if (*arr == '\0') //判断是否是空字符串
{
return 0;
}
出现’+‘或’-’
if (*arr == '-') //出现'-'或'+'字符
{
flat = -1;
arr++;
}
else if (*arr == '+')
{
flat = 1;
arr++;
}
解决数字越界
if (sum > INT_MAX || sum < INT_MIN) //判断是否越界
{
return 0;
}
解决非数字字符
if (isdigit(*arr)) //判断是否是数字字符
完整代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<ctype.h>
enum State
{
VALID,
INVALID
};
enum State s = INVALID; //假设非法状态
int my_atoi(const char* arr)
{
assert(arr); //判断是否是空指针
if (*arr == '\0') //判断是否是空字符串
{
return 0;
}
int flat = 1;
long long sum = 0;
if (*arr == '-') //出现'-'或'+'字符
{
flat = -1;
arr++;
}
else if (*arr == '+')
{
flat = 1;
arr++;
}
while (*arr)
{
if (isdigit(*arr)) //判断是否是数字字符
{
sum = sum * 10 + flat*(*arr - '0');
if (sum > INT_MAX || sum < INT_MIN) //判断是否越界
{
return 0;
}
}
else
{
return (int)sum;
}
arr++;
}
if (*arr == '\0')
{
s = VALID; //判断是否合法
}
return (int)sum;
}
int main()
{
char arr[20] = "-12345";
int ret = my_atoi(arr);
if (s == VALID)
{
printf("合法转换\n");
printf("%d\n", ret);
}
else
{
printf("非法转换\n");
printf("%d\n", ret);
}
return 0;
}
运行演示
1. 输入空指针时
2. 输入空字符时:
3.出现字符’+‘或’-'时
4.当数字大于int 类型最大值或小于最小值时
出现非数字字符时