日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

simple_strtoul()分析

發(fā)布時(shí)間:2023/12/13 综合教程 33 生活家
生活随笔 收集整理的這篇文章主要介紹了 simple_strtoul()分析 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

此函數(shù)有以下幾點(diǎn)值得注意:
1、第一個(gè)參數(shù)中的const。一般在函數(shù)的形參中,如果我們只是希望調(diào)用者使用該參數(shù),而不會(huì)去改變?cè)搮?shù)內(nèi)容(一般是指針指向的內(nèi)容),則可以聲明為const。
2、第二個(gè)參數(shù)。C語(yǔ)言中函數(shù)只能有一個(gè)返回值,但是有時(shí)候我們希望從函數(shù)中得到不止一個(gè)返回內(nèi)容怎么辦呢?只能通過(guò)參數(shù)了。一般的參數(shù)是用來(lái)向函數(shù)輸入信息的,但是指針型參數(shù)可以間接用來(lái)從函數(shù)輸出信息。使用時(shí)用戶只需傳入一個(gè)相應(yīng)的指針,函數(shù)中會(huì)把需要輸出的信息地址傳給這個(gè)指針,這樣在函數(shù)調(diào)用完成后,用戶即可到endp指針處去取函數(shù)傳出的值了。這就是用參數(shù)實(shí)現(xiàn)返回值的方式。但是要注意,在函數(shù)中千萬(wàn)不可把局部變量的地址傳給輸出型指針,因?yàn)榫植孔兞看嬖跅@铮瘮?shù)調(diào)用結(jié)束后即釋放了,傳出的指針指向的內(nèi)容是棧上已經(jīng)被釋放的部分,因此是無(wú)效的。(PS:高級(jí)語(yǔ)言中譬如C#有ref,out關(guān)鍵字,以明確指明該引用為輸出型)
3、第三個(gè)參數(shù)base。要注意這個(gè)base的機(jī)制,本函數(shù)中是按照這樣的理念來(lái)設(shè)計(jì)的。即如果str中有0x開(kāi)頭且接下來(lái)是數(shù)字則忽略用戶調(diào)用時(shí)輸入的base,強(qiáng)制為16進(jìn)制。如果str不是上面情況然后才看用戶輸入的base。用戶輸入非0則使用用戶指定的base,若用戶輸入0則自動(dòng)判斷是8進(jìn)制還是10進(jìn)制。需要強(qiáng)調(diào)的是:使用習(xí)慣決定理念,理念決定代碼邏輯。
4、注意if(endp)這里,在輸出型參數(shù)使用中,函數(shù)內(nèi)首先判斷endp是否為NULL,并以此來(lái)決定是否輸出這個(gè)機(jī)制來(lái)自于一個(gè)理念:這個(gè)輸出參數(shù)有可能是用戶關(guān)注的,也有可能是用戶不在意的。這樣處理可以給用戶自由,即用戶如果在意就傳一個(gè)有效指針過(guò)來(lái)接收;如果不在意調(diào)用時(shí)直接給個(gè)NULL就行。提供服務(wù)但不強(qiáng)迫,這樣很好。在OS的API中很多時(shí)候都有類似的技巧,請(qǐng)注意體會(huì)。

unsignedlongsimple_strtoul(constchar*cp,char**endp,unsignedintbase)
{
unsignedlongresult=0,value;
//對(duì)于base,首先如果*cp以0x開(kāi)頭且下來(lái)是數(shù)字,則一定為16進(jìn)制。然后如果用戶指定了一個(gè)非0的進(jìn)制,則
//遵循用戶輸入的進(jìn)制。如果用戶輸入了0進(jìn)制,則根據(jù)是否0開(kāi)頭來(lái)確定是8進(jìn)制還是10進(jìn)制
if(*cp=='0'){
cp++;
if((*cp=='x')&&isxdigit(cp[1])){
base=16;//如果cp是0x開(kāi)頭的,下面一個(gè)又是數(shù)字,那么base一定為16。
cp++;//此時(shí)即使用戶輸入了一個(gè)base,也忽略這個(gè)base而強(qiáng)制其為16。
}
if(!base){
base=8;//如果用戶輸入base為0,cp是0開(kāi)頭,接下來(lái)不是x,那么強(qiáng)制為8進(jìn)制
}
}
if(!base){
base=10;//如果用戶輸入base為0,cp是非0開(kāi)頭,則使用10進(jìn)制。
}
//while循環(huán)里value<base是精髓所在。這個(gè)解析停止的條件不能是null,而應(yīng)該是str中
//第一個(gè)不是數(shù)字的字母。這個(gè)字母的范圍取決于base,譬如如果是16進(jìn)制那么f也算是數(shù)字。
//而如果是8進(jìn)制那么9都不算是數(shù)字了。因此解析結(jié)束的范圍只能和base比較來(lái)限定。
while(isxdigit(*cp)&&(value=isdigit(*cp)?*cp-'0':(islower(*cp)
?toupper(*cp):*cp)-'A'+10)<base){
result=result*base+value;
cp++;
}
if(endp)//此處if判斷的作用是:用戶在使用這個(gè)函數(shù)時(shí),如果不關(guān)心endp則可以直接
*endp=(char*)cp;//使用null,而不必?fù)?dān)心程序運(yùn)行會(huì)出錯(cuò)。這種處理技巧很實(shí)用,用戶可以
returnresult;//自行決定是否使用這個(gè)函數(shù)提供的參數(shù)式返回值。
}

#c

總結(jié)

以上是生活随笔為你收集整理的simple_strtoul()分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。