strtoul函数的使用

2019-12-1709:56:18来源:Gavin-liuxj 评论 1,504 views

函数原型:

unsigned long strtoul(const char *nptr,char **endptr,int base )
参数1:字符串起始地址
参数2:返回字符串有效数字的结束地址,这也是为什么要用二级指针的原因。
参数3:转换基数。当base=0,自动判断字符串的类型,并按10进制输出,例如"0xa",就会把字符串当做16进制处理,输出的为10。更多的下面详细阐述。

static unsigned int simple_guess_base(const char *cp)  
{  
    if (cp[0] == '0') {  
        if (TOLOWER(cp[1]) == 'x' && isxdigit(cp[2]))  
            return 16;  
        else  
            return 8;  
    } else {  
        return 10;  
    }  
}  

unsigned long simple_strtoul(const char *cp, char **endp, unsigned int base)  
{  
    unsigned long result = 0;  

    if (!base)  
        base = simple_guess_base(cp);  

    if (base == 16 && cp[0] == '0' && TOLOWER(cp[1]) == 'x')  
        cp += 2;  

    while (isxdigit(*cp)) {  
        unsigned int value;  

        value = isdigit(*cp) ? *cp - '0' : TOLOWER(*cp) - 'a' + 10;  
        if (value >= base)  
            break;  
        result = result * base + value;  
        cp++;  
    }  

    if (endp)  
        *endp = (char *)cp;  
    return result;  
}  

函数分析:

  1. simple_strtoul()函数里的第一个if语句,如果base=0,自动对字符串里的数字格式进行分析,并返回基数,其值可取8、16、10。第二个if语句,进一步对16进制数处理,是cp指向第三个字符。

  2. while循环条件:判断是否为可处理的字符,其处理范围为‘0’-‘9’,‘a’-‘f,‘A'-'F'。
    循环体内:如果cp为数字则value=cp-'0';如果cp为字符value=cp-’a‘+10。
    判断value的值,如果value>=base,表明其值超过了基数,是一个不合法的数字,跳出循环。例如基数base=3, 数码符号为0,1,2,3。 此时value=4时就不是一个数码符号。

  3. 处理尾指针,使其指向字符串有效数字的结束地址。

  4. 返回result。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: