strtoul函數的使用


函數原型:

unsigned long strtoul(const char *nptr,char **endptr,int base )

參數1:字符串起始地址
參數2:返回字符串有效數字的結束地址,這也是為什么要用二級指針的原因。
參數3:轉換基數。當base=0,自動判斷字符串的類型,並按10進制輸出,例如"0xa",就會把字符串當做16進制處理,輸出的為10。更多的下面詳細闡述。

  1. static unsigned int simple_guess_base(const char *cp)  
  2. {  
  3.     if (cp[0] == '0') {  
  4.         if (TOLOWER(cp[1]) == 'x' && isxdigit(cp[2]))  
  5.             return 16;  
  6.         else  
  7.             return 8;  
  8.     } else {  
  9.         return 10;  
  10.     }  
  11. }  
  12.   
  13. unsigned long simple_strtoul(const char *cp, char **endp, unsigned int base)  
  14. {  
  15.     unsigned long result = 0;  
  16.   
  17.     if (!base)  
  18.         base = simple_guess_base(cp);  
  19.   
  20.     if (base == 16 && cp[0] == '0' && TOLOWER(cp[1]) == 'x')  
  21.         cp += 2;  
  22.   
  23.     while (isxdigit(*cp)) {  
  24.         unsigned int value;  
  25.   
  26.         value = isdigit(*cp) ? *cp - '0' : TOLOWER(*cp) - 'a' + 10;  
  27.         if (value >= base)  
  28.             break;  
  29.         result = result * base + value;  
  30.         cp++;  
  31.     }  
  32.   
  33.     if (endp)  
  34.         *endp = (char *)cp;  
  35.     return result;  
  36. }  

函數分析:
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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM