atoi
atoi函数要求
我所实现的atoi函数有以下几个要求:
1,这个函数需要丢弃之前的空白字符,直到找到第一个非空白字符。之后从这个字符开始,选取一个可选的正号或者符号后面跟随尽可能多的数字,并将其解释为数字的值。
2,字符串可以在形成整数的字符后包括多余的字符,将这些字符忽略,这些字符对于函数的行为没有影响。
3,如果字符串中的第一个非空白的字符不是有效的整数,或者没有这样的序列存在,字符串为空或者只包含空白字符则不进行转换。
4,如果不能执行有效的转换,则返回 0。如果正确的值超过的可表示的范围,则返回INT_MAX(2147483647)或 INT_MIN(-2147483648)。
小码哥要开始码代码啦!!!
#include<stdio.h>
#define INT_MAX 2147483647
#define INT_MIN -2147483678
//两个宏定义代表整型的边界值
long long strtoi(char *str,bool minus); //该处为strtoi函数的声明,定义成longlong类型,是为了判断比整型边界值更大和更小的值。
//该函数主要用于判断非空格首字符,接收遍历函数strtoi所传回来的整型值
int my_atoi(const char *str)
{
int num = 0;//num用来表示所转换后的整数值
if(str != NULL && *str != '\0')//等于NULL直接返回0
{
while(*str == ' ')//如果首字符是空格,那就接着向后遍历,直到找到第一个非空格的字符
{
++str;
continue;
}
bool minus = false;//设置一个标志,来判断该数的正负
if(*str == '+')
{
++str;
}
else if(*str == '-')
{
++str;
minus = true;//true代表该数为负数
}
if(*str != '\0')
{
num = strtoi(str,minus);
}
}
return num;
}
//strtoi函数时遍历其余所有的字符
long long strtoi(const char *str,bool minus)
{
long long num = 0;
while(*str != '\0')
{
if(*str >=0 && *str <= 9)//0-9为合法数字
{
int flag = minus ? -1 : 1; //代表该值的正负
num = num * 10 + flag * (*str - '0');//将字符转换为相应的数字
if(!minus && num > 0x7FFFFFFF)//整型最大值2的31次方-1
{
return INT_MAX;
}
else if(minus && num < (signed int)0x80000000)//整型最小值-2的31次方
//由于整型默认为无符号整型,所有比较负数大小时,要强转为有符号整型
{
return INT_MIN;
}
++str;
}
else //遇到非法字符直接结束循环,返回当前的num
{
break;
}
}
return num;
}
int main()
{
char str[100] = {0};
scanf("%s",str);
int k = my_atoi(str);
printf("%d\n",k);
return 0;
}
测试用例
测试用例还有很多,由于考虑到大家的观赏性,小码哥就举了这四类,大家可以自己去多测几组。
atoi函数的实现就到这里,码友们有什么问题可以给小码哥我留言,我会及时解决大家的问题。
码完,收工啦。
相关阅读
C#中Directory.GetFiles() 函数的使用方法(读取目录中
转自:http://www.365jz.com/article/24023 C#中Directory.GetFiles(string path , string searchPattern, SearchOption sea
今天做一个单选框,效果如下:这里需要自定义一个RadioGrouppackage yisu.cn.wedgit; import android.content.Context; import andr
线程间通信的几种实现方式 首先,要短信线程间通信的模型有两种:共享内存和消息传递,以下方式都是基本这两种模型来实现的。我们来基
用C语言实现一个C语言的编译器 目标:基于C0+文法的编译器,生成语法树,四元式,符号表,最后生成X86汇编(386) 接下来介绍一下整个的设计和
HANDLE CreateFile( _In_ LPCSTR lpFileName,//指向文件名的指针 _In_ DWORD dwDesiredAccess,// 访问模式(写 / 读) _In