(一)使用的头文件
stdio.h ctype.h
(二)atoi函数功能
该函数声明在string.h头文件中,用于将字符串转换成整型数据
(三)思路
要实现该函数,我们需要尽可能的考虑到用户输入数据的各种情况,所谓具有一定的健壮性。
可能出现的情况如下:整型、浮点型、正负数、八进制数、带有非法符号的、八进制数、十六进制数等情况
"1243",
"a12.43",
"+12.45",
" -12.45",
"0123 45656",
"-078",
" qef21",
"0x123aBfbx"
(四)编程步骤:
(1)去除字符串开头的空格符(空格 0x20、水平制表符 0x09 )
(2)判断正数负数,去除正负号
(3)判断进制,分类调用进制对应下的转换函数
(五)代码实现
#include <stdio.h>
#include <ctype.h>
//字符串转整型
//十进制
int atoi_Dec(const char* src)
{
if (src == NULL) return 0;
int sum = 0;
while (*src != '\0' && isdigit(*src))
{
sum = sum * 10 + *src - '0';
src++;
}
return sum;
}
//八进制
int atoi_Oct(const char* src)
{
if (src == NULL) return 0;
int sum = 0;
while (*src != '\0' && isdigit(*src) && *src != '8' && *src != '9')
{
sum = sum * 8 + *src - '0';
src++;
}
return sum;
}
//十六进制
int atoi_Hex(const char* src)
{
if (src == NULL) return 0;
int sum = 0;
while (*src != '\0' && isxdigit(*src))
{
char ch = 0;
//123aBfbx
//把所有的A~F转成小写
if (isdigit(*src))
{
ch = *src - '0';
}
else
{
ch = tolower(*src) - 'a' + 10;
}
sum = sum * 16 + ch;
src++;
}
return sum;
}
int my_atoi(const char* src)
{
if (src == NULL)
return 0;
//标记正负数: -1是负数,1是正数,默认正数
int flag = 1;
int token = 0; //记录返回值
//去掉开头空格字符,src指向第一个有效数
while (isblank(*src))
{
src++;
}
//判断是否是负数
if (*src == '-')
{
flag = -1;
src++;
}
if (*src == '+')
{
src++;
}
//判断进制
if (*src == '0')
{
//十六进制
if (*(src + 1) == 'x' || *(src + 1) == 'X')
{
token = atoi_Hex(src + 2);
}
else //八进制
{
token = atoi_Oct(src + 1);
}
}
else //十进制
{
token = atoi_Dec(src);
}
if (flag == -1)
{
token = -token;
}
return token;
}
int main()
{
const char* str[] =
{
"1243",
"a12.43",
"+12.45",
" -12.45",
"0123 45656",
"-078",
" qef21",
"0x123aBfbx"
};
int count = sizeof(str) / sizeof(str[0]);
for (int i = 0; i < count; i++)
{
printf("%s:%d\n", str[i], my_atoi(str[i]));
}
return 0;
}