C 标准库 atoi 函数的实现

来源:互联网 发布:wps如何筛选excel数据 编辑:程序博客网 时间:2024/05/16 09:44
/* * atoi 是一个解析字符串的一个函数 * 可以将字符串解析为 int 类型 * 解决如下的问题: *   1 空白符 *   2 正号和负号 *   3 进制 *   4 溢出 */#include <cstdio>/*int atoi(const char *str) {    char *p = (char *)str;    int ret = 0;    int retPre = 0;    int over_flow = 1<<(sizeof(int)*8-1);    int sign = 1;    int base = 10;    // 跳过空白符    while (*p==' ' || *p=='\t') {        ++p;    }    // 判定符号    if (*p=='-') sign = -1, ++p;    else if (*p=='+') sign = 1, ++p;    else sign = 1;    // 判定进制    if (*p=='0' && *(p+1)=='x' || *(p+1)=='X') base=16, p+=2;    else if(*p=='0') base=8, ++p;    else base = 10;    while (*p != '\0') {        retPre = ret;        if ((*p>='0'&&*p<='7') || (base!=8&&*p>='8'&&*p<='9')) {            ret *= base;            ret += *p - '0';        }        else if (base==16 && ((*p>='a' && *p<='f') || (*p>='A' && *p<='F'))) {            ret *= base;            switch (*p) {                case 'a': case 'A': ret += 10; break;                case 'b': case 'B': ret += 11; break;                case 'c': case 'C': ret += 12; break;                case 'd': case 'D': ret += 13; break;                case 'e': case 'E': ret += 14; break;                case 'f': case 'F': ret += 15; break;                default: break;            }        }        else {            break;        }        // 溢出处理        if (sign==-1 && ret==over_flow) {            break;        }        else if ((ret&over_flow)==over_flow) {            ret = retPre;            break;        }        ++p;    }    if (sign==-1) ret = -ret;    return ret;}*/int atoi(const char *str) {    char *p = (char *)str;    int ret = 0;    int sign;    // 跳过空白符    while (*p==' ' || *p=='\t') {        ++p;    }    // 判定符号    if (*p=='-') sign = -1, ++p;    else if (*p=='+') sign = 1, ++p;    else sign = 1;    // 只处理十进制    while (*p>='0' && *p<='9') {        ret *= 10;        ret += *p - '0';        ++p;    }    if (sign==-1) ret = -ret;    return ret;}int main() {    printf("%d\n", atoi(" -2147483648002"));    printf("%d\n", atoi(" -2147483650"));    printf("%d\n", atoi(" 2147483647"));    printf("%d\n", atoi(" 2147483648"));    printf("%d\n", atoi(" 012"));    printf("%d\n", atoi(" 10"));    printf("%d\n", atoi(" 0xa"));    return 0;}
0 0
原创粉丝点击