strtol,strtoll,strtoul, strtoull字符串轉化成數字

名字:

strtol, strtoll, strtoul, strtoull

convert a string to a (signed, unsigned ) long integer string

聲明:

#include<stdlib.h> ( 這個是C標準庫,與linux無關。這套函數是通用的。)

long int strtol(const char *nptr, char **endptr, int base);
long long int strtoll(const char *nptr, char **endptr, int base);

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

說明,第一個參數 nptr是要轉化的字符串第三個參數base說明nptr的進制。base 取值範圍 0,2-36

這幾個函數會忽略nptr前面的空格( ' ', '\t', '\n' '\f', '\v' '\r' ,由isspace判定爲真的字符)

while (*nptr && isspace ( *nptr ) ) ++ nptr;

然後遇到非合法字符結束;

base = 2; 合法字符爲0, 1

base = 3; 合法字符爲0,1, 2

...

base = 11; 合法字符爲0,1,...,9,a(A)

...

base = 36;合法字符爲0, 1, ...,9,a(A),...,z(Z)。

字符 a-z,是忽略大小寫的,混着來也行,例如 strtol("aA", NULL, 11)依然能得到正確的結果。

函數的第二個參數endptr可以爲空,如果不爲空,則 endptr 保存函數結束前的那個非合法字符的地址

如果沒有合法字符,則 *endptr = nptr,函數返回0.

例如:

1.

char *endptr;

char nptr[]="123abc";

int ret = strtol(nptr, &endptr, 10 );

由於10進制裏沒有“數字”a,所以掃描到a,結束。

這樣 ret = 123;

endptr = &nptr[3]; ( printf("%s", endptr);將得到字符串 abc )

2.

char nptr[]=" \n\t    abc";

int ret = strtol(nptr, &endptr, 10 );

由於函數會忽略nptr前面的空格(' ', '\n'...),所以,從字符a開始掃描,但是遇見的“第一個”即是不合法字符。

所以函數結束。 ret=0; endptr = nptr;

以下的討論,會認爲 nptr 前面沒有空格,

即執行過類似於while (*nptr  &&isspace ( *nptr ) ) ++ nptr;

如果base 爲0.則分3種情況:

如果nptr 以0x(零x)開頭,則把nptr當成16進制處理。

如果npstr以0(零)開頭,則把nptr當成8進制處理。

否則,把nptr當成10進制。

對於函數執行錯誤,如傳了一個非合法base,則errno會設置相關值

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章