atoi函数
atoi 函数用来将字符串转化为数字的,C++手册上是这样描述的
The function first discards as many whitespace characters as necessary until the first non-whitespace character is found. Then, starting from this character, takes an optional initial plus or minus sign followed by as many numerical digits as possible, and interprets them as a numerical value。
大概意思就是
这个函数首先丢弃尽可能多的空白字符(isspace来判断是否为空格以及制表符)直达遇到第一个非空白符(即遇到正负符号或者数字)。然后从这个字符开始,取一个可选的正负号,然后尽可能多的字符转换为数字。
注:其实这个函数的核心代码时比较容易实现的,就是比较多的注意str的非法情况,以及数字越界问题。
步骤:
(1)处理字符串,处理前面的非法字符,空格以及制表符,直到遇到第一个符号或者数字,
(2)代码核心,将数字字符转换为int
(3)判断是否越界
//int 0111 1111 1111 1111 1111 1111 1111 1111 正溢出
// 7 f f f f f f f
// 1000 0000 0000 0000 0000 0000 0000 0000 负溢出
// 8 0 0 0 0 0 0 0
代码实现
enum
{
valid = 1, inValid = 0
};
bool flag = valid;
int Atoi(const char *str)
{
//1 处理str,考虑非法输入
if (str == NULL)
{
flag = inValid;
return 0;
}
int symobol = 1;
//
//处理前面的空格,制表符
while (isspace(*str))
++str;
if (*str == '\0')
{
flag = inValid;
return 0;
}
//处理符号位
if (*str == '-')
{
++str;
symobol = -1;
}
else if (*str == '+')
++str;
//2转换为int
int number = 0;
while (*str != '\0'&& isdigit(*str))
{
number = number * 10 + *str - '0';
++str;
}
//判断是否转换完,以及
if (*str != '\0')
{
flag = inValid;
return 0;
}
//数字是否溢出
if ((symobol == 1 && number > 0x7fffffff) || (symobol == -1 && number < (signed int)0x80000000))
{
flag = inValid;
return 0;
}
return number*symobol;
}
itoa函数
标准接口 char * itoa(int value, char * str, int base);
void Reverse(char *str)
{
char *start = str;
char *end = str;
while (*end != '\0')
++end;
--end;
while(start < end)
{
std::swap(*start, *end);
++start;
--end;
}
}
//可能存在正负数
void Itoa(int value, char * str)
{
int i = 0;
char flag = 0;
if (value < 0)
{
flag = '-';
value = -value;
}
//
while (value)
{
str[i++] = value % 10 + '0';
value /= 10;
}
if (flag == '-')
str[i++] = flag;
Reverse(str);
return str;
}
判断字符是否为字母或者数字的函数
int isalnum ( int c );
判断字符是否为字母
int isalpha ( int c );
判断字符是否为数字
int isdigit ( int c );
判断是否为小写字母
int islower ( int c );
将大写字母转换为 小写 tolower
判断是否大写字母
int isupper ( int c );
将小写字母转化为大写 toupper
判断字符是否为空格制表符
int isspace ( int c );
判断数字是否为十六进制
int isxdigit ( int c );