文章目录
- 一. 什么是atoi函数
- 二. 模拟实现函数atoi
- 三. 总结atoi
一. 什么是atoi函数
atoi函数是将常量字符串转化为整数
int atoi(const char str);*
注意:该函数的返回值为int,所以不能超过int范围,如果数字很大超过就会截断,返回截断后的值即int的最大左右范围值。
举个例子:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int ret1 = atoi("-123");
int ret2 = atoi("11111111111111111111111");
printf("%d\n", ret1);
printf("%d\n", ret2);
printf("%d\n", INT_MAX);
}
结果表明超过int范围的值结果会截断,截断后值和int最大值一样。
二. 模拟实现函数atoi
上面不理解,没事,看例子——》
例子一:传一个空字符串
例子二:情况二、传一个空指针
例子三:传一个空格加整数的字符串
例子四:传一个整数加字母的字符串
例子五:传一个字母加整数字符串
例子6:传一个负整数
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<ctype.h>
int main()
{
printf("%d\n", atoi(""));
printf("%d\n", atoi(" 123"));
printf("%d\n", atoi("123sgsdg"));
printf("%d\n", atoi("adgd123"));
printf("%d\n", atoi("-123"));
return 0;
}
例子一和四都是非法转换,所以模拟实现要先处理这两种情况:
#include <stdio.h>
#include <ctype.h>
#include <limits.h>
enum Status
{
VALID,
INVALID
};
enum Status status = INVALID;
int my_atoi(const char* str)
{
if (str == NULL)
{
return 0;
}
if (*str == '\0')
{
return 0;
}
//空白字符
while (isspace(*str))
{
str++;
}
int flag = 1;
if (*str == '+')
{
flag = 1;
str++;
}
else if (*str == '-')
{
flag = -1;
str++;
}
//处理数字字符
long long ret = 0;
while (isdigit(*str))
{
ret = ret * 10 + (*str - '0') * flag;
if (ret<INT_MIN || ret>INT_MAX)
{
return 0;
}
str++;
}
if (*str == '\0')
{
status = VALID;
return (int)ret;
}
else
{
return (int)ret;
}
}
int main()
{
int ret = my_atoi("-123");
if (status == VALID)
printf("合法转换:%d\n", ret);
else
printf("非法转换:%d\n", ret);
return 0;
}
三. 总结atoi
1、该函数首先会丢弃尽可能多的空白字符,直到找到第一个非空白字符,然后,从这个字符开始,取一个可选的初识加号或者减号,后跟尽可能多的十进制数字,并将他们返回一个int类型的数值。
2、若该字符串是在整数的字符后包含其他字符,则这些字符将会被忽略,返回其他字符之前的整数,并且不会对该函数造成任何影响。
3、若该字符串中第一个非空字符序列表示有效的整数,或是一个空指针,或只包含空白字符,则不执行任何转换,并且返回零。
小弟制作不易,劳烦各位兄弟点点小小的关注,谢谢了