

已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
個人收集整理-ZQc語言中sprintf和sscanf用法全()使用說明在將各種類型的數(shù)據(jù)構(gòu)造成字符串時,的強大功能很少會讓你失望。由于跟在用法上幾乎一樣,只是打印的目的地不同而已,前者打印到字符串中,后者則直接在命令行上輸出。這也導致比有用得多。是個變參函數(shù),定義如下:( *, * , . );除了前兩個參數(shù)類型固定外,后面可以接任意多個參數(shù)。而它的精華,顯然就在第二個參數(shù):格式化字符串上。和都使用格式化字符串來指定串的格式,在格式串內(nèi)部使用一些以“”開頭的格式說明符( )來占據(jù)一個位置,在后邊的變參列表中提供相應的變量,最終函數(shù)就會用相應位置的變量來替代那個說明符,產(chǎn)生一個調(diào)用者想要的字符串。b5E2R。b5E2R。格式化數(shù)字字符串最常見的應用之一莫過于把整數(shù)打印到字符串中,所以,在大多數(shù)場合可以替代。如:把整數(shù) 打印成一個字符串保存在 中。(, , ); 產(chǎn)生可以指定寬度,不足的左邊補空格:(, , , ); 產(chǎn)生: 當然也可以左對齊:(, , , ); 產(chǎn)生: 也可以按照 進制打印:(, , ); 小寫 進制,寬度占 個位置,右對齊(, , ); 大寫 進制,寬度占 個位置,左對齊這樣,一個整數(shù)的 進制字符串就很容易得到,但我們在打印 進制內(nèi)容時,通常想要一種左邊補 的等寬格式,那該怎么做呢?很簡單,在表示寬度的數(shù)字前面加個 就可以了。p1Ean。p1Ean。(, , ); 產(chǎn)生:上面以”進行的 進制打印同樣也可以使用這種左邊補 的方式。這里要注意一個符號擴展的問題:比如,假如我們想打印短整數(shù)() 的內(nèi)存 進制表示形式,在 平臺上,一個 型占 個字節(jié),所以我們自然希望用 個 進制數(shù)字來打印它:DXDiT。DXDiT。 ;(, , );產(chǎn)生“”,怎么回事?因為是個變參函數(shù),除了前面兩個參數(shù)之外,后面的參數(shù)都不是類型安全的,函數(shù)更沒有辦法僅僅通過一個“”就能得知當初函數(shù)調(diào)用前參數(shù)壓棧時被壓進來的到底是個 字節(jié)的整數(shù)還是個 字節(jié)的短整數(shù),所以采取了統(tǒng)一 字節(jié)的處理方式,導致參數(shù)壓棧時做了符號擴展,擴展成了 位的整數(shù),打印時 個位置不夠了,就把 位整數(shù) 的 位 進制都打印出來了。RTCrp。RTCrp。如果你想看的本來面目,那么就應該讓編譯器做 擴展而不是符號擴展(擴展時二進制左邊補 而不是補符號位):5PCzV。5PCzV。(, , ( );就可以了?;蛘撸?;(, , );和還可以按 進制打印整數(shù)字符串,使用”。注意 進制和 進制都不會打印出負數(shù),都是無符號的,實際上也就是變量的內(nèi)部編碼的直接的 進制或 進制表示??刂聘↑c數(shù)打印格式浮點數(shù)的打印和格式控制是的又一大常用功能,浮點數(shù)使用格式符”控制,默認保留小數(shù)點后 位數(shù)字,比如:(, , ); 產(chǎn)生但有時我們希望自己控制打印的寬度和小數(shù)位數(shù),這時就應該使用:”格式,其中 表示打印的寬度, 表示小數(shù)點后的位數(shù)。比如:(, , ); 產(chǎn)生: (, , ); 產(chǎn)生: (, , ); 不指定總寬度,產(chǎn)生:注意一個問題,你猜 ;(, , );會打出什么東東來?“”?對嗎?自己試試就知道了,同時也試試下面這個:(, , ();第一個打出來的肯定不是正確結(jié)果,原因跟前面提到的一樣,參數(shù)壓棧時調(diào)用者并不知道跟相對應的格式控制符是個”。而函數(shù)執(zhí)行時函數(shù)本身則并不知道當年被壓入棧里的是個整數(shù),于是可憐的保存整數(shù) 的那 個字節(jié)就被不由分說地強行作為浮點數(shù)格式來解釋了,整個亂套了。不過,如果有人有興趣使用手工編碼一個浮點數(shù),那么倒可以使用這種方法來檢驗一下你手工編排的結(jié)果是否正確。jLBHr。jLBHr。字符碼對照我們知道,在語言中, 也是一種普通的 類型,除了字長之外,它與, 這些類型沒有本質(zhì)區(qū)別,只不過被大家習慣用來表示字符和字符串而已。(或許當年該把這個類型叫做“”,然后現(xiàn)在就可以根據(jù)實際情況,使用 或 來把 通過定義出來,這樣更合適些)于是,使用”或者”打印一個字符,便能得出它的 進制或 進制的 碼;反過來,使用”打印一個整數(shù),便可以看到它所對應的 字符。以下程序段把所有可見字符的 碼對照表打印到屏幕上(這里采用,注意”與”合用時自動為 進制數(shù)增加”前綴):xHAQX。xHAQX。( ; ; ) ( : , , , );連接字符串的格式控制串中既然可以插入各種東西,并最終把它們“連成一串”,自然也就能夠連接字符串,從而在許多場合可以替代,但能夠一次連接多個字符串(自然也可以同時在它們中間插入別的內(nèi)容,總之非常靈活)。比如:* ;* ;(, ., , ); 產(chǎn)生: . 只能連接字符串(一段以結(jié)尾的字符數(shù)組或叫做字符緩沖,),但有時我們有兩段字符緩沖區(qū),他們并不是以結(jié)尾。比如許多從第三方庫函數(shù)中返回的字符數(shù)組,從硬件或者網(wǎng)絡傳輸中讀進來的字符流,它們未必每一段字符序列后面都有個相應的來結(jié)尾。如果直接連接,不管是還是肯定會導致非法內(nèi)存操作,而也至少要求第一個參數(shù)是個,那該怎么辦呢?我們自然會想起前面介紹打印整數(shù)和浮點數(shù)時可以指定寬度,字符串也一樣的。比如:LDAYt。LDAYt。 , , , , , , ; , , , , , , ;如果:(, , , ); !十有八九要出問題了。是否可以改成:(, , , );也沒好到哪兒去,正確的應該是:(, , , )產(chǎn)生:這可以類比打印浮點數(shù)的”,在”中, 表示占用寬度(字符串長度不足時補空格,超出了則按照實際寬度打?。?, 才表示從相應的字符串中最多取用的字符數(shù)。通常在打印字符串時 沒什么大用,還是點號后面的 用的多。自然,也可以前后都只取部分字符:Zzz6Z。Zzz6Z。(, , , )產(chǎn)生:在許多時候,我們或許還希望這些格式控制符中用以指定長度信息的數(shù)字是動態(tài)的,而不是靜態(tài)指定的,因為許多時候,程序要到運行時才會清楚到底需要取字符數(shù)組中的幾個字符,這種動態(tài)的寬度精度設置功能在的實現(xiàn)中也被考慮到了,采用”*”來占用一個本來需要一個指定寬度或精度的常數(shù)數(shù)字的位置,同樣,而實際的寬度或精度就可以和其它被打印的變量一樣被提供出來,于是,上面的例子可以變成:dvzfv。dvzfv。(, .*.*, , , , );或者:(, .*.*, (), , (), );實際上,前面介紹的打印字符、整數(shù)、浮點數(shù)等都可以動態(tài)指定那些常量值,比如:(, *, , ); 產(chǎn)生 (, *, , ); 產(chǎn)生,產(chǎn)生(, *.*, , , ); 產(chǎn)生 打印地址信息有時調(diào)試程序時,我們可能想查看某些變量或者成員的地址,由于地址或者指針也不過是個 位的數(shù),你完全可以使用打印無符號整數(shù)的”把他們打印出來:rqyn1。rqyn1。(, , );不過通常人們還是喜歡使用 進制而不是 進制來顯示一個地址:(, , );然而,這些都是間接的方法,對于地址打印,提供了專門的”:(, , );我覺得它實際上就相當于:(, *, * ( *), );利用的返回值較少有人注意函數(shù)的返回值,但有時它卻是有用的,返回了本次函數(shù)調(diào)用最終打印到字符緩沖區(qū)中的字符數(shù)目。也就是說每當一次調(diào)用結(jié)束以后,你無須再調(diào)用一次便已經(jīng)知道了結(jié)果字符串的長度。如: (, , );對于正整數(shù)來說,便等于整數(shù) 的 進制位數(shù)。下面的是個完整的例子,產(chǎn)生 個, )之間的隨機數(shù),并將他們打印到一個字符數(shù)組 中,以逗號分隔開。 () (); ; ;( ; ; ) ( , , () ); 將最后一個逗號換成換行符。(); ;設想當你從數(shù)據(jù)庫中取出一條記錄,然后希望把他們的各個字段按照某種規(guī)則連接成一個字符串時,就可以使用這種方法,從理論上講,他應該比不斷的效率高,因為每次調(diào)用都需要先找到最后的那個的位置,而在上面給出的例子中,我們每次都利用返回值把這個位置直接記下來了。使用的常見問題是個變參函數(shù),使用時經(jīng)常出問題,而且只要出問題通常就是能導致程序崩潰的內(nèi)存訪問錯誤,但好在由誤用導致的問題雖然嚴重,卻很容易找出,無非就是那么幾種情況,通常用眼睛再把出錯的代碼多看幾眼就看出來了。? 緩沖區(qū)溢出第一個參數(shù)的長度太短了,沒的說,給個大點的地方吧。當然也可能是后面的參數(shù)的問題,建議變參對應一定要細心,而打印字符串時,盡量使用”的形式指定最大字符數(shù)。? 忘記了第一個參數(shù)低級得不能再低級問題,用用得太慣了。偶就常犯。:。(? 變參對應出問題通常是忘記了提供對應某個格式符的變參,導致以后的參數(shù)統(tǒng)統(tǒng)錯位,檢查檢查吧。尤其是對應”*”的那些參數(shù),都提供了嗎?不要把一個整數(shù)對應一個”,編譯器會覺得你欺她太甚了(編譯器是和 的媽媽,應該是個女的,)。還有個不錯的表妹:,專門用于格式化時間字符串的,用法跟她表哥很像,也是一大堆格式控制符,只是畢竟小姑娘家心細,她還要調(diào)用者指定緩沖區(qū)的最大長度,可能是為了在出現(xiàn)問題時可以推卸責任吧。這里舉個例子: ();產(chǎn)生 格式的字符串。 ;(, (), , ();在 中也能找到他的知音:,在 中自然也有她的同道:,這一對由于從面向?qū)ο竽睦锏玫搅速澲?,用以寫出的代碼更覺優(yōu)雅。()函數(shù)用法定義函數(shù) ( * * ,.);函數(shù)說明 ()會將參數(shù)的字符串根據(jù)參數(shù)字符串來轉(zhuǎn)換并格式化數(shù)據(jù)。格式轉(zhuǎn)換形式請參考()。轉(zhuǎn)換后的結(jié)果存于對應的參數(shù)內(nèi)。Emxvx。Emxvx。 返回值成功則返回參數(shù)數(shù)目,失敗則返回,錯誤原因存于中。返回表示失敗 否則,表示正確格式化數(shù)據(jù)的個數(shù) 例如:(,, , ); 如果三個變成都讀入成功會返回。 如果只讀入了第一個整數(shù)到則會返回。證明無法從讀入第二個整數(shù)。SixE2。SixE2。 范例 () ; ; ” ”; ; (,” * ”); (“ ”); 執(zhí)行 (), ,.)語句中中的內(nèi)容含義為: “ ”符號用于聲明字符串,它比“”更具體,可以用于設置讀取的樣式。例如“”只讀取小寫字母,讀到其它字符就結(jié)束。注意,方括號中如果有“”,代表一直讀到某字符為止。例如:6ewMy。6ewMy。 “”:讀取字符串,一直到出現(xiàn)“”號為止。 “”:讀取個字節(jié)的字符串,出現(xiàn)“”號時結(jié)束。 所以,“ ”的意義就是, 讀取兩個字節(jié)大小的字符串,第一個字符串可以用結(jié)束,第二個字符串可以用回車符結(jié)束。 它們的具體闡述,參見:“ ”章節(jié),和“ ”章節(jié)。*kavU4。kavU4。大家都知道是一個很好用的函數(shù),利用它可以從字符串中取出整數(shù)、浮點數(shù)和字符串等等。它的使用方法簡單,特別對于整數(shù)和浮點數(shù)來說。但新手可能并不知道處理字符串時的一些高級用法,這里做個簡要說明吧。y6v3A。y6v3A。. 常見用法。以下是引用片段:;(,);();. 取指定長度的字符串。如在下例中,取最大長度為字節(jié)的字符串。以下是引用片段:(,);();. 取到指定字符為止的字符串。如在下例中,取遇到空格為止字符串。以下是引用片段:(,);();. 取僅包含指定字符集的字符串。如在下例中,取僅包含到和小寫字母的字符串。以下是引用片段:(,);();. 取到指定字符集為止的字符串。如在下例中,取遇到大寫字母為止的字符串。以下是引用片段:(,);();*M2ub6。M2ub6。名稱: () 從一個字符串中讀進與指定格式相符的數(shù)據(jù).語法: ( , , , . );整數(shù)( 字符串, 字符串, 混合, 混合 . );用法: 以指定的格式去解讀字符串. 中除了 和 以外, 亦可包含其他的字符串作為格式. 每一個 或 都對應一個參數(shù), 按順序為, . 讀入一個整數(shù)到參數(shù)中, 而 讀入一個字符串. * 亦可用于格式中, (即* 和*) 加了星號(*) 表示跳過此數(shù)據(jù)不讀入. (也就是不把此數(shù)據(jù)讀入?yún)?shù)中) 的() 與 的() 雖然相似, 但仍有不同之處. 的() 不需要(也不可) 提供變量的內(nèi)存位址給(), 只需要給予變量的名字. 另一個不同點是, 的() 對于: ( , , , ); 的語法, 將會把中的第一個英文單字(即第一個空白字符以前的內(nèi)容) 讀入, 后面其余的內(nèi)容讀入.0YujC。0YujC。() 會返回符合格式的 和 總數(shù).以前曾經(jīng)編寫過這樣的小程序:一個文本文件,每行是一條記錄,每條記錄中包含多個字段,每個字段之間以某種定界符分開,舉例如下:eUts8。eUts8。 (各字段以逗號分隔,內(nèi)容依次是:物品名稱,生產(chǎn)廠家,型號,數(shù)量,價格)如果要對這樣的一行記錄進行處理,提取出各個字段,怎么做比較好呢?我以前的做法是在一個循環(huán)中用函數(shù)每次取一個字段,然后將內(nèi)容保存到一個字符串數(shù)組中。這樣做雖然可行,但我總感覺寫出的代碼有些啰嗦。sQsAE。sQsAE。最近看到一段代碼,用的標準庫函數(shù),處理這樣的數(shù)據(jù),只需一行就可以了。我把代碼整理了一下,去掉了無關(guān)的部分,核心部分如下:GMsIa。GMsIa。 ; ; , ; , ; (, );(, , );(, , , , , );下面簡單做些解說: 最多讀入個字符,直到遇見定界符,但不包含定界符 讀入一個浮點數(shù),直到遇見定界符 讀入一個整數(shù),直到遇見定界符 最多讀入個字符,忽略行尾的回車符是不是很簡潔明了呢? () ; ; ; ; ; ; ; ; ; ; ; ;(, );();();();();();();();(, );();();(, $);();();();();();();(); ; * 流行音樂專用;上面是源串,我要分別得到,流行音樂專用字段注意:因為這幾個字段的值會變化,所以我要用格
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 網(wǎng)絡貸款財務擔保合同負債監(jiān)管與風險控制協(xié)議
- 住宅小區(qū)場地租賃合同終止及社區(qū)服務協(xié)議
- 廠房租賃合同違約責任范本
- 建筑材料性能測試加工及認證合同
- 餐飲行業(yè)服務員招聘及培訓考核合同
- 文物保護區(qū)施工專項方案
- 卡尺使用培訓
- 中班健康活動《零食要少吃》主題教案
- 糖尿病病人的護理和教育
- 員工應急能力培訓
- 人工智能應用產(chǎn)業(yè)園及配套基礎(chǔ)設施項目可行性研究報告(范文模板)
- 未成年人權(quán)益保護法律解析
- 藥品售后服務承諾書示例
- 2025年南模中學自招試題及答案
- 《水利工程建設項目文件收集與歸檔規(guī)范SLT 824-2024》知識培訓
- “艾梅乙”感染者消除醫(yī)療歧視制度-
- 肉類食品供貨合同7篇
- 天津師范大學《心理與教育統(tǒng)計學》2023-2024學年第二學期期末試卷
- 鋁合金樓梯踏步施工方案
- 裝修工程招標書范本
- 2025團校入團培訓考試題庫(含答案)
評論
0/150
提交評論