网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
4.数字字符后面有非数字字符
5.前面有字符0后面有负号
6.只有负号和数字字符
7.负号加数字字符加非数字字符
得到的结果如下
根据上述测试结果,我们可以大致模拟atoi函数的实现。
二、模拟实现
当我们模拟实现atoi函数的时候,最困难的就是处理掉一些函数处理异常字符只保留部分字符串的功能。
当函数传过来的指针是空指针时,要进行断言;当函数传过来的字符串为空字符串时,要提示使用者:Abnormal Results(异常结果),再返回0,与正常返回结果是0的情况做区分;字符串的前半部分的空格和0都要在正常的 1~9 字符出现之前删掉,这部分用循环来完成;当正常数字字符串前面有符号时,要将符号转化为flag的正负来使用;当字符串前半部分有其他字符(字符+和字符-除外)时,直接返回0。
数字字符串部分的处理:当程序识别出了即将开始进行字符串的转化时,还要保证开始之后的字符也为数字字符,在确保这写后,定义一个long long型的长整型,用来存放转化后的数字。当要转化大数字字符串转化为数字太大时,则也返回异常值0。
解引用指针(*str)可得到数字字符,再用这个数字字符减去字符 ‘0’ ,就可以得到整形的数字,如此往复,经过简单的处理,则可得到数字字符串对应的整个整形数字,这个得到的数字就是正常值,返回即可。
在判断返回的值是否是正常时,可以定义一个全局枚举类型变量,并将它的初值赋为 WRONG,如果正常转化成了数字,则再将枚举类型变量的值赋值为RIGHT。
#include<stdlib.h>
#include<stdio.h>
#include<assert.h>
enum JUD
{
WRONG,
RIGHT
}JUD=WRONG;
int my_atoi(const char* str)
{
assert(str);
int flag = 1;
if (*str == '\0')
return 0;
while(*str == ' '||*str=='0')//处理空格
str++;
if (*str > '9' || *str < '0'&&*str!='-'&&*str!='+')
return 0;
if (*str == '-')
{
flag = -1;
str++;
}
else if (*str == '+')
str++;
long long ret = 0;
if (*str >= '1' && *str <= '9')
{
while (*str != '\0'&&*str>='0'&&*str<='9')
{
ret = ret * 10 + flag * (*str - '0');
str++;
if (ret<INT_MIN || ret>INT_MAX)
return 0;
}
}
JUD = RIGHT;
return (int)ret;
}
int main()
{
char str1[30] = { "0" };
scanf("%s", str1);
int ret = my_atoi(str1);
if (JUD == WRONG)
printf("Abnormal Results:%d\n", ret);
else
printf("NOrmal Results:%d\n", ret);
return 0;
}
博主写了好长时间,如果你能给博主一个免费三连鼓励一下博主的话,那么我觉得你的真是 泰 裤 辣 !!!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
et/topics/618668825)**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!