myatoi()函数堪称经典,我相信很多童鞋都可以做出来,但是要做好却不容易。下面来看看
myatoi()函数实现功能:(1)八进制,十进制,十六进制字符分别转整形数字
(2)遇到'.'退出
(3)有正负数
(4)防止整形数字越界,INT_MAX,INT_MIN
(5)开头空格跳过,中间遇到空格退出
看看是不是条件有点多啊,实现起来也是不容易的。
代码如下:
#include<assert.h>
#include<iostream>
int dec_atoi(const char* str, bool tag)
{
assert(str != NULL);
int sum = 0;
int i = 0;
while (str[i] != '\0' && isdigit(str[i]))//判断结尾和数据是否合法(整形数字)
{
char x = str[i] - '0';
if (!tag)//正数
{
if ((INT_MAX - sum * 10) >= x)
{
sum = sum * 10 + x;
}
else
{
sum = INT_MAX;
break;///不可丢,超出范围退出
}
}
else
{
if ((INT_MAX + 1 - sum * 10) >= x )//此时sum为正数,(INT_MIN的绝对值比INT_MIN的值大1)
{
sum = sum * 10 + x;
}
else
{
sum = INT_MIN;
break;
}
}
++i;不能忘记++i
}
return sum;
}int otc_atoi(const char* str, bool tag)
{
assert(str != NULL);
int sum = 0;
int i = 0;
while (str[i] != '\0' && isdigit(str[i]) && str[i] != '8' && str[i] != '9')//8进制不能是数字8和9
{
char x = str[i] - '0';
if (!tag)//正数
{
if ((INT_MAX - sum * 8) >= x)
{
sum = sum * 8 + x;
}
else
{
sum = INT_MAX;
break;
}
}
else
{
if ((INT_MAX - sum * 8) >= x - 1)
{
sum = sum * 8 + x;
}
else
{
sum = INT_MIN;
break;
}
}
++i;
}
return sum;
}
int hex_atoi(const char* str, bool tag)
{
assert(str != NULL);
int sum = 0;
int i = 0;
while (str[i] != '\0' && isxdigit(str[i]))//判断是否是十六进制的数字和字母
{
if (!tag)//正数
{
char x = str[i];
if ((INT_MAX - sum * 16) >= x)
{
if (isalpha(str[i]))//判断字符
{x = tolower(str[i]);
sum = sum * 16 + x - 'a' + 10;
}
else
{
sum = sum * 16 + x - '0';
}
}
else
{
sum = INT_MAX;
break;///不可丢
}
}
else
{
char x = str[i];
if ((INT_MAX - sum * 16) >= x -1)
{
if (isalpha(str[i]))
{x = tolower(str[i]);
sum = sum * 16 + x - 'a' + 10;
}
else
{
sum = sum * 16 + x - '0';
}
}
else
{
sum = INT_MIN;
break;
}
}
++i;
}
return sum;
}int myatoi(const char* str)
{
assert(str != NULL);
if (NULL == str) return -1;
int sum = 0;
bool flag = 0;
while (*str == ' ')
str++;if (*str == '-')
{
flag = 1;
str++;
}
if (*str == '+')
{
str++;
}
if (*str == '.')
{
return -1;
}
/*if (!isdigit(*str))
{
return -1;
}*/
if (*str == '0')
{
if (*(str+1) == 'x' || *(str+1) == 'X')///str+1不能是str++
{
sum = hex_atoi(str + 2, flag);//
}
else
{
sum = otc_atoi(str + 1, flag);else
}
}
else
{
sum = dec_atoi(str, flag);
}
if (flag)
{
sum = -sum;
}
return sum;
}
int main()
{
const char str[][20] = { "12321","-123","123.34","0xff","0X12","012","011","12g",
"0123456623455431234","-01234","-123.a","123456789098765",
"12345678","-12345678909876" };
int len = sizeof(str) / sizeof(str[0]);
for (int i = 0; i < len; ++i)
{
cout << str[i] << " -->" << myatoi(str[i]) << endl;
}return 0;
}
结果如下: