My_atoi的函数要求
1. "123456" 转化为整形值 123456
2." 123456",跳过前面的空格转化为整型值123456,如果在字符串中间遇见空格则停止转换,例如" 123 456"将其转换为123返回
3."+123456",返回123456
4."-123456" ,返回-123456
5."0b123"或者"0B123"将其以二进制转换为十进制整形值
6."0123"将其以八进制转换为十进制整形值
7."0x123"或者"0X123"将其以十六进制转换为十进制整形值
8.考虑到输入错误的情况---比如将0 输成'o'或'O',1 输成 'l' 或 'i'
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <ctype.h>
int My_Dec(char*str) //十进制字符串转化为整型
{
assert(str != NULL);
int sum = 0;
while (*str!='\0')
{
if (*str == 'o' || *str == 'O')
{
sum = sum * 10;
str++;
}
else if (*str == 'l' || *str == 'i')
{
sum = sum * 10 + 1;
str++;
}
else if ('0' <= *str && *str <= '9')
{
sum = sum * 10 + *str - '0';
str++;
}
else
{
return sum;
}
}
return sum;
}
int My_Bin(char*str) //二进制字符串转化为整型
{
assert(str != NULL);
int sum = 0;
while (*str != '\0')
{
if (*str == 'o' || *str == 'O')
{
sum = sum * 2;
str++;
}
else if (*str == 'l' || *str == 'i')
{
sum = sum * 2 + 1;
str++;
}
else if ('0' == *str || *str == '1')
{
sum = sum * 2 + *str - '0';
str++;
}
else
{
return sum;
}
}
return sum;
}
int My_Oct(char*str) //八进制字符串转化整型
{
assert(str != NULL);
int sum = 0;
while (*str != '\0')
{
if (*str == 'o' || *str == 'O')
{
sum = sum * 8;
str++;
}
else if (*str == 'l' || *str == 'i')
{
sum = sum * 8 + 1;
str++;
}
else if ('0' <= *str && *str <= '7')
{
sum = sum * 8 + *str - '0';
str++;
}
else
{
return sum;
}
}
return sum;
}
int My_Hex(char*str) //十六进制字符串转化整型
{
assert(str != NULL);
int sum = 0;
while (isxdigit(*str) || *str == 'l' || *str == 'i' || *str == 'o' || *str == 'O')
{
if (isalpha(*str) && *str != 'l'&&*str != 'i' && *str != 'o' && *str != 'O') //字母
{
sum = sum * 16 + tolower(*str) - 'a'+10;
str++;
}
else if (*str == 'l' || *str == 'i')
{
sum = sum * 16 + 1;
str++;
}
else if (*str == 'o' || *str == 'O')
{
sum = sum * 16 ;
str++;
}
else
{
sum = sum * 16 + *str - '0';
str++;
}
}
return sum;
}
int My_atoi(char*str)
{
assert(str != NULL&&*str != '\0');
while (*str == ' ')
{
str++;
}
int tag = 0; //0正 1负
if (*str == '-')
{
str++;
tag = 1;
}
if (*str == '+')
{
str++;
}
int sum = 0;
if (*str == '0' || *str == 'o' || *str == 'O')
{
if (*(str + 1) == 'b' || *(str + 1) == 'B')
{
str += 2;
sum = My_Oct(str);
}
else if (*(str + 1) == 'x' || *(str + 1) == 'X')
{
str += 2;
sum = My_Hex(str);
}
else
{
str++;
sum = My_Bin(str);
}
}
else
{
sum = My_Dec(str);
}
if (tag)
{
sum = -sum;
}
return sum;
}
int main()
{
const char* str[] = {
"123", " 1234", "+lo2345", "123.45", " -7o89", "oB1234", "oxO1Oo23456","lllo3O56",
"011111","01110111"};
for (int i = 0; i < sizeof(str) / sizeof(str[0]); i++)
{
printf("%s=>%d\n", str[i], My_atoi(str[i]));
}
system("pause");
return 0;
}
如果是二进制请以0开头,不然没法区分二进制与十进制!!!
那里有问题,请随意评论,我一定认真检查~~~