strtol,strtoll,strtoul, strtoull函数的使用
?
?
說明,第一個(gè)參數(shù) nptr是要轉(zhuǎn)化的字符串。第三個(gè)參數(shù)base說明nptr的進(jìn)制。base 取值范圍 0,2-36
這幾個(gè)函數(shù)會忽略nptr前面的空格( ' ', '\t', '\n' '\f', '\v' '\r' ,由isspace判定為真的字符)
while (*nptr && isspace ( *nptr ) ) ++ nptr;
然后遇到非合法字符結(jié)束;
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)依然能得到正確的結(jié)果。
?
函數(shù)的第二個(gè)參數(shù)endptr可以為空,如果不為空,則 endptr 保存函數(shù)結(jié)束前的那個(gè)非合法字符的地址。
如果沒有合法字符,則 *endptr = nptr,函數(shù)返回0.
例如:
1.
char *endptr;
char nptr[]="123abc";
int ret = strtol(nptr, &endptr, 10 );
由于10進(jìn)制里沒有“數(shù)字”a,所以掃描到a,結(jié)束。
這樣 ret = 123;
endptr = &nptr[3]; ( printf("%s", endptr);將得到字符串 abc )
2.
char nptr[]=" \n\t??? abc";
int ret = strtol(nptr, &endptr, 10 );
由于函數(shù)會忽略nptr前面的空格(' ', '\n'...),所以,從字符a開始掃描,但是遇見的“第一個(gè)”即是不合法字符。
所以函數(shù)結(jié)束。 ret=0; endptr = nptr;
?
?
?
?
以下的討論,會認(rèn)為 nptr 前面沒有空格,
即執(zhí)行過類似于while (*nptr? &&isspace ( *nptr ) ) ++ nptr;
如果base 為0.則分3種情況:
如果nptr 以0x(零x)開頭,則把nptr當(dāng)成16進(jìn)制處理。
如果npstr以0(零)開頭,則把nptr當(dāng)成8進(jìn)制處理。
否則,把nptr當(dāng)成10進(jìn)制。
?
?
?
?
對于函數(shù)執(zhí)行錯(cuò)誤,如傳了一個(gè)非合法base,則errno會設(shè)置相關(guān)值
總結(jié)
以上是生活随笔為你收集整理的strtol,strtoll,strtoul, strtoull函数的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: lol非中路的ap
- 下一篇: 明日方舟2021三幻神四基石是谁