1.atoi函数的使用
atoi函数的作用是将字符串转换成整数,它所包含的头文件是stdlib.h。
我们来举个例子感受一下atoi函数:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int main()
{
char* str = "123";
int i = atoi(str);
printf("%d", i);
}
2.atoi函数的模拟实现
要想完成atoi函数的模拟实现,就要考虑到可能会输入的几种特殊情况:
1.遇到正负号:
char* str = "-123";
观察结果发现正负号是可以正常输出的。
2.打印的字符串中含有空格。
这时候,我们还要分两种情况
a.开头遇到了空格。
char* str = " -123";
观察运行结果,字符串是跳过开头的空格直接将数字打印出来的。
b.在字符串中间遇到了空格。
char* str = "-12 3";
观察运行结果,发现在字符串中间遇到空格的话,会直接停止打印,同时将空格前面的数字打印出来。
3.在字符串当中遇到非数字的字符。
char* str = "12sgahvh3";
观察运行结构,发现在字符串当中遇到非数字的字符会直接停止打印,将非数字的字符前面的数字打印出来。
4.使用atoi函数打印出来的数字大于INT_MAX,或者小于INT_MIN。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int main()
{
char* str1 = "100000000000000";
char* str2 = "-100000000000000";
int i = atoi(str1);
int j = atoi(str2);
printf("%d\n", i);
printf("%d\n", j);
}
观察运行结果,发现如果使用atoi函数打印出来的数字大于INT_MAX,或者小于INT_MIN,结果会直接输出INT_MAX或者INT_MIN。
考虑完以上这几种特殊情况,就来开始着手atoi函数的模拟实现:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
enum State
{
VAILD,//合法转换
INVAILD//非法转换
}state= INVAILD;
int MyAtoi(char* Str)
{
assert(Str);
if (*Str == '\0')
return 0;
while (*Str == ' ')
Str++;
int flag = 1;
double num = 0;
//此处必须设成double类型,否则如果num的值大于INT_MAX或者小于INT_MIN的话,
//就会因为int类型存不下那么大的值而直接变成乱值
int count = 0;
if (*Str == '+')
{
Str++;
}
if (*Str == '-')
{
flag = -1;
Str++;
}
while (*Str >= '0' && *Str <= '9')
{
count = *Str - '0';
num = num * 10 + count;
if (num > INT_MAX)
num = INT_MAX;
if (num < INT_MIN)
num = INT_MIN;
Str++;
}
num = num * flag;
if (*Str == '\0')
state = VAILD;
return (int)num;
}
int main()
{
char* str = "-123000f";
int i = MyAtoi(str);
if (state == VAILD)
printf("合法转换:%d\n", i);
else
printf("非法转换:%d\n", i);
return 0;
}