/*
题目1:(简答题:10.0分)
编程实现将字符串转换为整型数;
int my_atoi(const char *str);
1.遇到非数字字母,停止转换;
示例: str = “234.324” ; 返回值是234;
2.首先出现空格的字符串可以转换,转换开始后,遇到空格停止转换;
示例: str =" 342 456"; 返回值是342;
3.可以处理正负号;
示例: str = " +234.bad" ; 返回值是 234; str = " -342ab.234" ; 返回值是:-342;
4.可以处理八进制,和十六进制;
示例: str = " +0xff"; 返回值是 255; str = " 0123" ; 返回值是 83;
5 可以处理int 型溢出的情况;
示例; str = “567898765678987656789”; str = 2147483647; (INT_MAX 宏在 limits.h 头文件中)
str = "-234324665544325345325; str = - 2147483648; (INT_MIN 宏在limits.h 头文件中)
*/
#include <iostream>
#include <ctype.h>
#include <limits.h>
#include <stack>
using namespace std;
//处理单个atoi
int my_atoi_single(const char p)
{
int tmp;
if(isdigit(p))
{
tmp = p - '0';
}
else
{
tmp = p - 'W';
}
return tmp;
}
//atoi的子函数,将进制,字符,符号传递进来
long long my_atoi_Son(const char *p,int flag,int system)
{
stack<char> sta;
long long sum = 0;
int tmp = 0;
while(isdigit(*p) || (*p >= 'a' && * p <= 'f'&&system == 16))
{
sta.push(*p);
++p;
}
int n = sta.size();
for(int i = 0; i < n;++i)
{
tmp = my_atoi_single(sta.top());
sta.pop();
for(int j = 0;j < i;++j)
{
tmp = tmp * system;
}
sum += tmp;
if((sum * flag) >= INT_MAX)
{
sum = INT_MAX;
return sum;
}
if((sum * flag) <= INT_MIN)
{
sum = INT_MIN;
return sum;
}
}
return flag * sum;
}
long long my_atoi(const char *str)
{
long long integer = 0;
int flag = 1;
int system = 10;
const char * p = str;
while(*p == ' ')
{
++p;
}
if (*p == '-')
{
flag = -1;
++p;
}
else if(*p == '+')
{
++p;
}
if(!isdigit(*p))
{
throw exception("输入的字符串,无法进行atoi!");
}
if(*p == '0')
{
++p;
system = 8;
if(*p == 'x')
{
++p;
system = 16;
}
}
integer = my_atoi_Son(p,flag,system);
return integer;
}
int main()
{
const char * p = "-567898765678987656789";
printf("%d\n",my_atoi(p));
}
2534



被折叠的 条评论
为什么被折叠?



