函數原型:
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。