c语言 atoi 函数的功能和模拟实现
1.atoi函数的功能
atoi函数功能是将数字字符串转换为整数;字符串"123456"被此函数转换成123456 atoi函数调用所用的头文件 #include<stdlib.h>
atoi函数的使用例子
代码如下
#include<stdio.h>
#include<stdlib.h>
int main()
{
char arr[100] = "123456";
int ret = atoi(arr);
printf("%d\n", ret);
return 0;
}
2.模拟实现atoi
初步模拟实现atoi
可以把数字字符串转换成整数,首先不考虑正负号问题 都为正
此方法适用于任何一个整数
代码如下 分析如下
int my_atoi(const char* str)
{
int n = 0;
while (*str!='\0')
{
n = n * 10 + (*str - '0');//把字符串转换成整数
str++;
}
return n;
}
int main()
{
char arr[100] = "12345";
int ret = my_atoi(arr);
printf("%d\n", ret);
return 0;
}
atoi函数具体实现考虑6种情况
1.空指针
2.空字符串
3. 空字符的空格
4. 非数字的字符
5. 溢出问题
6. 正负号问题
如何解决存在的6种情况:
1.空指针问题使用assert函数断言:
2.空字符串第一个元素是‘\0’,判断是否返回‘\0’,注意返回的是字符还是空字符串,存在非法转换和合法转换,利用,枚举解决,创建一个枚举类型初始化为非法,由于非法情况多,合法只有一种。其实将空字符转换为整数0是一种非法转换。
3.当遇到空字符串有空格时,可以直接跳过所在的内容,指针++指向下一个内容。
4. 非数字的字符:"145ary23",直接返回145无需继续放下走,也是非法转换。
5.溢出问题是数字字符,当所得的N的值大于最大整型或小于最小整型,返回最大整型或最小整型,此问题也是非法转换。
6.正负号问题 用变量flag记录,初始化为1,正数时为1,字符串中有‘-’时为-1,记录符号位。
函数使用来判断是否为空格,该函数参数若为空格则返回非0,参数若为非空格则返回0;所以我们用一个while循环并使用该函数就能轻松解决第三个问题;使用isspace函数需要包含
#include <ctype.h>
该函数用来判断是否是数字字符,若是数字字符'0'到'9'返回非0,若不是数字字符返回0;使用isdigit函数需要包含#include <ctype.h>
当是数字字符时,将其减去'0'即转换为数字,再继续判断下个字符,若是非数字字符则直接返回
代码如下
#include<stdio.h>
#include<ctype.h>
#include<limits.h>
#include<assert.h>
enum Status
{
VALID,
INVALID
}status = INVALID;//初始化为非法
int my_atoi(char* str)
{
int flag = 1;//记录符号位
//空指针
assert(str);
//空字符串问题
if (*str == '\0')
{
return 0;
}
//空字符问题
while (*str == ' ')
{
str++;
}
//正负号问题
if (*str == '+')
{
flag = 1;
str++;
}
if (*str == '-')
{
flag = -1;
str++;
}
long long n = 0;
while (*str != '\0')
{
//不是数字字符问题
if (isdigit(*str))
{
n = n * 10 + (*str + '0');
//溢出问题
if (n > INT_MAX)
{
return INT_MAX;
break;
}
if (n < INT_MIN)
{
return INT_MIN;
break;
}
}
else
{
//不是数字字符直接跳出循环,status此时时无效的INVALID
break;
}
str++;
}
if (*str == '\0')
{
status = VALID;
}
n *= flag;
return (int)n;//强制类型转换int类型
}
int main()
{
int n = 0;
char* str = "-1234er56";
n = my_atoi(str);
//判断合法非法
if (status == VALID)
{
printf("合法转换:n=%d\n", n);
}
else
{
printf("非法转换:n=%d\n", n);
}
return 0;
}
谢谢观看