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; }标准接口 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 );