c語(yǔ)言中sprintf和sscanf用法全_第1頁(yè)
c語(yǔ)言中sprintf和sscanf用法全_第2頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

個(gè)人收集整理-ZQc語(yǔ)言中sprintf和sscanf用法全()使用說(shuō)明在將各種類(lèi)型的數(shù)據(jù)構(gòu)造成字符串時(shí),的強(qiáng)大功能很少會(huì)讓你失望。由于跟在用法上幾乎一樣,只是打印的目的地不同而已,前者打印到字符串中,后者則直接在命令行上輸出。這也導(dǎo)致比有用得多。是個(gè)變參函數(shù),定義如下:( *, * , . );除了前兩個(gè)參數(shù)類(lèi)型固定外,后面可以接任意多個(gè)參數(shù)。而它的精華,顯然就在第二個(gè)參數(shù):格式化字符串上。和都使用格式化字符串來(lái)指定串的格式,在格式串內(nèi)部使用一些以“”開(kāi)頭的格式說(shuō)明符( )來(lái)占據(jù)一個(gè)位置,在后邊的變參列表中提供相應(yīng)的變量,最終函數(shù)就會(huì)用相應(yīng)位置的變量來(lái)替代那個(gè)說(shuō)明符,產(chǎn)生一個(gè)調(diào)用者想要的字符串。b5E2R。b5E2R。格式化數(shù)字字符串最常見(jiàn)的應(yīng)用之一莫過(guò)于把整數(shù)打印到字符串中,所以,在大多數(shù)場(chǎng)合可以替代。如:把整數(shù) 打印成一個(gè)字符串保存在 中。(, , ); 產(chǎn)生可以指定寬度,不足的左邊補(bǔ)空格:(, , , ); 產(chǎn)生: 當(dāng)然也可以左對(duì)齊:(, , , ); 產(chǎn)生: 也可以按照 進(jìn)制打?。?, , ); 小寫(xiě) 進(jìn)制,寬度占 個(gè)位置,右對(duì)齊(, , ); 大寫(xiě) 進(jìn)制,寬度占 個(gè)位置,左對(duì)齊這樣,一個(gè)整數(shù)的 進(jìn)制字符串就很容易得到,但我們?cè)诖蛴?進(jìn)制內(nèi)容時(shí),通常想要一種左邊補(bǔ) 的等寬格式,那該怎么做呢?很簡(jiǎn)單,在表示寬度的數(shù)字前面加個(gè) 就可以了。p1Ean。p1Ean。(, , ); 產(chǎn)生:上面以”進(jìn)行的 進(jìn)制打印同樣也可以使用這種左邊補(bǔ) 的方式。這里要注意一個(gè)符號(hào)擴(kuò)展的問(wèn)題:比如,假如我們想打印短整數(shù)() 的內(nèi)存 進(jìn)制表示形式,在 平臺(tái)上,一個(gè) 型占 個(gè)字節(jié),所以我們自然希望用 個(gè) 進(jìn)制數(shù)字來(lái)打印它:DXDiT。DXDiT。 ;(, , );產(chǎn)生“”,怎么回事?因?yàn)槭莻€(gè)變參函數(shù),除了前面兩個(gè)參數(shù)之外,后面的參數(shù)都不是類(lèi)型安全的,函數(shù)更沒(méi)有辦法僅僅通過(guò)一個(gè)“”就能得知當(dāng)初函數(shù)調(diào)用前參數(shù)壓棧時(shí)被壓進(jìn)來(lái)的到底是個(gè) 字節(jié)的整數(shù)還是個(gè) 字節(jié)的短整數(shù),所以采取了統(tǒng)一 字節(jié)的處理方式,導(dǎo)致參數(shù)壓棧時(shí)做了符號(hào)擴(kuò)展,擴(kuò)展成了 位的整數(shù),打印時(shí) 個(gè)位置不夠了,就把 位整數(shù) 的 位 進(jìn)制都打印出來(lái)了。RTCrp。RTCrp。如果你想看的本來(lái)面目,那么就應(yīng)該讓編譯器做 擴(kuò)展而不是符號(hào)擴(kuò)展(擴(kuò)展時(shí)二進(jìn)制左邊補(bǔ) 而不是補(bǔ)符號(hào)位):5PCzV。5PCzV。(, , ( );就可以了?;蛘撸?;(, , );和還可以按 進(jìn)制打印整數(shù)字符串,使用”。注意 進(jìn)制和 進(jìn)制都不會(huì)打印出負(fù)數(shù),都是無(wú)符號(hào)的,實(shí)際上也就是變量的內(nèi)部編碼的直接的 進(jìn)制或 進(jìn)制表示??刂聘↑c(diǎn)數(shù)打印格式浮點(diǎn)數(shù)的打印和格式控制是的又一大常用功能,浮點(diǎn)數(shù)使用格式符”控制,默認(rèn)保留小數(shù)點(diǎn)后 位數(shù)字,比如:(, , ); 產(chǎn)生但有時(shí)我們希望自己控制打印的寬度和小數(shù)位數(shù),這時(shí)就應(yīng)該使用:”格式,其中 表示打印的寬度, 表示小數(shù)點(diǎn)后的位數(shù)。比如:(, , ); 產(chǎn)生: (, , ); 產(chǎn)生: (, , ); 不指定總寬度,產(chǎn)生:注意一個(gè)問(wèn)題,你猜 ;(, , );會(huì)打出什么東東來(lái)?“”?對(duì)嗎?自己試試就知道了,同時(shí)也試試下面這個(gè):(, , ();第一個(gè)打出來(lái)的肯定不是正確結(jié)果,原因跟前面提到的一樣,參數(shù)壓棧時(shí)調(diào)用者并不知道跟相對(duì)應(yīng)的格式控制符是個(gè)”。而函數(shù)執(zhí)行時(shí)函數(shù)本身則并不知道當(dāng)年被壓入棧里的是個(gè)整數(shù),于是可憐的保存整數(shù) 的那 個(gè)字節(jié)就被不由分說(shuō)地強(qiáng)行作為浮點(diǎn)數(shù)格式來(lái)解釋了,整個(gè)亂套了。不過(guò),如果有人有興趣使用手工編碼一個(gè)浮點(diǎn)數(shù),那么倒可以使用這種方法來(lái)檢驗(yàn)一下你手工編排的結(jié)果是否正確。jLBHr。jLBHr。字符碼對(duì)照我們知道,在語(yǔ)言中, 也是一種普通的 類(lèi)型,除了字長(zhǎng)之外,它與, 這些類(lèi)型沒(méi)有本質(zhì)區(qū)別,只不過(guò)被大家習(xí)慣用來(lái)表示字符和字符串而已。(或許當(dāng)年該把這個(gè)類(lèi)型叫做“”,然后現(xiàn)在就可以根據(jù)實(shí)際情況,使用 或 來(lái)把 通過(guò)定義出來(lái),這樣更合適些)于是,使用”或者”打印一個(gè)字符,便能得出它的 進(jìn)制或 進(jìn)制的 碼;反過(guò)來(lái),使用”打印一個(gè)整數(shù),便可以看到它所對(duì)應(yīng)的 字符。以下程序段把所有可見(jiàn)字符的 碼對(duì)照表打印到屏幕上(這里采用,注意”與”合用時(shí)自動(dòng)為 進(jìn)制數(shù)增加”前綴):xHAQX。xHAQX。( ; ; ) ( : , , , );連接字符串的格式控制串中既然可以插入各種東西,并最終把它們“連成一串”,自然也就能夠連接字符串,從而在許多場(chǎng)合可以替代,但能夠一次連接多個(gè)字符串(自然也可以同時(shí)在它們中間插入別的內(nèi)容,總之非常靈活)。比如:* ;* ;(, ., , ); 產(chǎn)生: . 只能連接字符串(一段以結(jié)尾的字符數(shù)組或叫做字符緩沖,),但有時(shí)我們有兩段字符緩沖區(qū),他們并不是以結(jié)尾。比如許多從第三方庫(kù)函數(shù)中返回的字符數(shù)組,從硬件或者網(wǎng)絡(luò)傳輸中讀進(jìn)來(lái)的字符流,它們未必每一段字符序列后面都有個(gè)相應(yīng)的來(lái)結(jié)尾。如果直接連接,不管是還是肯定會(huì)導(dǎo)致非法內(nèi)存操作,而也至少要求第一個(gè)參數(shù)是個(gè),那該怎么辦呢?我們自然會(huì)想起前面介紹打印整數(shù)和浮點(diǎn)數(shù)時(shí)可以指定寬度,字符串也一樣的。比如:LDAYt。LDAYt。 , , , , , , ; , , , , , , ;如果:(, , , ); !十有八九要出問(wèn)題了。是否可以改成:(, , , );也沒(méi)好到哪兒去,正確的應(yīng)該是:(, , , )產(chǎn)生:這可以類(lèi)比打印浮點(diǎn)數(shù)的”,在”中, 表示占用寬度(字符串長(zhǎng)度不足時(shí)補(bǔ)空格,超出了則按照實(shí)際寬度打印), 才表示從相應(yīng)的字符串中最多取用的字符數(shù)。通常在打印字符串時(shí) 沒(méi)什么大用,還是點(diǎn)號(hào)后面的 用的多。自然,也可以前后都只取部分字符:Zzz6Z。Zzz6Z。(, , , )產(chǎn)生:在許多時(shí)候,我們或許還希望這些格式控制符中用以指定長(zhǎng)度信息的數(shù)字是動(dòng)態(tài)的,而不是靜態(tài)指定的,因?yàn)樵S多時(shí)候,程序要到運(yùn)行時(shí)才會(huì)清楚到底需要取字符數(shù)組中的幾個(gè)字符,這種動(dòng)態(tài)的寬度精度設(shè)置功能在的實(shí)現(xiàn)中也被考慮到了,采用”*”來(lái)占用一個(gè)本來(lái)需要一個(gè)指定寬度或精度的常數(shù)數(shù)字的位置,同樣,而實(shí)際的寬度或精度就可以和其它被打印的變量一樣被提供出來(lái),于是,上面的例子可以變成:dvzfv。dvzfv。(, .*.*, , , , );或者:(, .*.*, (), , (), );實(shí)際上,前面介紹的打印字符、整數(shù)、浮點(diǎn)數(shù)等都可以動(dòng)態(tài)指定那些常量值,比如:(, *, , ); 產(chǎn)生 (, *, , ); 產(chǎn)生,產(chǎn)生(, *.*, , , ); 產(chǎn)生 打印地址信息有時(shí)調(diào)試程序時(shí),我們可能想查看某些變量或者成員的地址,由于地址或者指針也不過(guò)是個(gè) 位的數(shù),你完全可以使用打印無(wú)符號(hào)整數(shù)的”把他們打印出來(lái):rqyn1。rqyn1。(, , );不過(guò)通常人們還是喜歡使用 進(jìn)制而不是 進(jìn)制來(lái)顯示一個(gè)地址:(, , );然而,這些都是間接的方法,對(duì)于地址打印,提供了專(zhuān)門(mén)的”:(, , );我覺(jué)得它實(shí)際上就相當(dāng)于:(, *, * ( *), );利用的返回值較少有人注意函數(shù)的返回值,但有時(shí)它卻是有用的,返回了本次函數(shù)調(diào)用最終打印到字符緩沖區(qū)中的字符數(shù)目。也就是說(shuō)每當(dāng)一次調(diào)用結(jié)束以后,你無(wú)須再調(diào)用一次便已經(jīng)知道了結(jié)果字符串的長(zhǎng)度。如: (, , );對(duì)于正整數(shù)來(lái)說(shuō),便等于整數(shù) 的 進(jìn)制位數(shù)。下面的是個(gè)完整的例子,產(chǎn)生 個(gè), )之間的隨機(jī)數(shù),并將他們打印到一個(gè)字符數(shù)組 中,以逗號(hào)分隔開(kāi)。 () (); ; ;( ; ; ) ( , , () ); 將最后一個(gè)逗號(hào)換成換行符。(); ;設(shè)想當(dāng)你從數(shù)據(jù)庫(kù)中取出一條記錄,然后希望把他們的各個(gè)字段按照某種規(guī)則連接成一個(gè)字符串時(shí),就可以使用這種方法,從理論上講,他應(yīng)該比不斷的效率高,因?yàn)槊看握{(diào)用都需要先找到最后的那個(gè)的位置,而在上面給出的例子中,我們每次都利用返回值把這個(gè)位置直接記下來(lái)了。使用的常見(jiàn)問(wèn)題是個(gè)變參函數(shù),使用時(shí)經(jīng)常出問(wèn)題,而且只要出問(wèn)題通常就是能導(dǎo)致程序崩潰的內(nèi)存訪問(wèn)錯(cuò)誤,但好在由誤用導(dǎo)致的問(wèn)題雖然嚴(yán)重,卻很容易找出,無(wú)非就是那么幾種情況,通常用眼睛再把出錯(cuò)的代碼多看幾眼就看出來(lái)了。? 緩沖區(qū)溢出第一個(gè)參數(shù)的長(zhǎng)度太短了,沒(méi)的說(shuō),給個(gè)大點(diǎn)的地方吧。當(dāng)然也可能是后面的參數(shù)的問(wèn)題,建議變參對(duì)應(yīng)一定要細(xì)心,而打印字符串時(shí),盡量使用”的形式指定最大字符數(shù)。? 忘記了第一個(gè)參數(shù)低級(jí)得不能再低級(jí)問(wèn)題,用用得太慣了。偶就常犯。:。(? 變參對(duì)應(yīng)出問(wèn)題通常是忘記了提供對(duì)應(yīng)某個(gè)格式符的變參,導(dǎo)致以后的參數(shù)統(tǒng)統(tǒng)錯(cuò)位,檢查檢查吧。尤其是對(duì)應(yīng)”*”的那些參數(shù),都提供了嗎?不要把一個(gè)整數(shù)對(duì)應(yīng)一個(gè)”,編譯器會(huì)覺(jué)得你欺她太甚了(編譯器是和 的媽媽?zhuān)瑧?yīng)該是個(gè)女的,)。還有個(gè)不錯(cuò)的表妹:,專(zhuān)門(mén)用于格式化時(shí)間字符串的,用法跟她表哥很像,也是一大堆格式控制符,只是畢竟小姑娘家心細(xì),她還要調(diào)用者指定緩沖區(qū)的最大長(zhǎng)度,可能是為了在出現(xiàn)問(wèn)題時(shí)可以推卸責(zé)任吧。這里舉個(gè)例子: ();產(chǎn)生 格式的字符串。 ;(, (), , ();在 中也能找到他的知音:,在 中自然也有她的同道:,這一對(duì)由于從面向?qū)ο竽睦锏玫搅速澲?,用以?xiě)出的代碼更覺(jué)優(yōu)雅。()函數(shù)用法定義函數(shù) ( * * ,.);函數(shù)說(shuō)明 ()會(huì)將參數(shù)的字符串根據(jù)參數(shù)字符串來(lái)轉(zhuǎn)換并格式化數(shù)據(jù)。格式轉(zhuǎn)換形式請(qǐng)參考()。轉(zhuǎn)換后的結(jié)果存于對(duì)應(yīng)的參數(shù)內(nèi)。Emxvx。Emxvx。 返回值成功則返回參數(shù)數(shù)目,失敗則返回,錯(cuò)誤原因存于中。返回表示失敗 否則,表示正確格式化數(shù)據(jù)的個(gè)數(shù) 例如:(,, , ); 如果三個(gè)變成都讀入成功會(huì)返回。 如果只讀入了第一個(gè)整數(shù)到則會(huì)返回。證明無(wú)法從讀入第二個(gè)整數(shù)。SixE2。SixE2。 范例 () ; ; ” ”; ; (,” * ”); (“ ”); 執(zhí)行 (), ,.)語(yǔ)句中中的內(nèi)容含義為: “ ”符號(hào)用于聲明字符串,它比“”更具體,可以用于設(shè)置讀取的樣式。例如“”只讀取小寫(xiě)字母,讀到其它字符就結(jié)束。注意,方括號(hào)中如果有“”,代表一直讀到某字符為止。例如:6ewMy。6ewMy。 “”:讀取字符串,一直到出現(xiàn)“”號(hào)為止。 “”:讀取個(gè)字節(jié)的字符串,出現(xiàn)“”號(hào)時(shí)結(jié)束。 所以,“ ”的意義就是, 讀取兩個(gè)字節(jié)大小的字符串,第一個(gè)字符串可以用結(jié)束,第二個(gè)字符串可以用回車(chē)符結(jié)束。 它們的具體闡述,參見(jiàn):“ ”章節(jié),和“ ”章節(jié)。*kavU4。kavU4。大家都知道是一個(gè)很好用的函數(shù),利用它可以從字符串中取出整數(shù)、浮點(diǎn)數(shù)和字符串等等。它的使用方法簡(jiǎn)單,特別對(duì)于整數(shù)和浮點(diǎn)數(shù)來(lái)說(shuō)。但新手可能并不知道處理字符串時(shí)的一些高級(jí)用法,這里做個(gè)簡(jiǎn)要說(shuō)明吧。y6v3A。y6v3A。. 常見(jiàn)用法。以下是引用片段:;(,);();. 取指定長(zhǎng)度的字符串。如在下例中,取最大長(zhǎng)度為字節(jié)的字符串。以下是引用片段:(,);();. 取到指定字符為止的字符串。如在下例中,取遇到空格為止字符串。以下是引用片段:(,);();. 取僅包含指定字符集的字符串。如在下例中,取僅包含到和小寫(xiě)字母的字符串。以下是引用片段:(,);();. 取到指定字符集為止的字符串。如在下例中,取遇到大寫(xiě)字母為止的字符串。以下是引用片段:(,);();*M2ub6。M2ub6。名稱: () 從一個(gè)字符串中讀進(jìn)與指定格式相符的數(shù)據(jù).語(yǔ)法: ( , , , . );整數(shù)( 字符串, 字符串, 混合, 混合 . );用法: 以指定的格式去解讀字符串. 中除了 和 以外, 亦可包含其他的字符串作為格式. 每一個(gè) 或 都對(duì)應(yīng)一個(gè)參數(shù), 按順序?yàn)? . 讀入一個(gè)整數(shù)到參數(shù)中, 而 讀入一個(gè)字符串. * 亦可用于格式中, (即* 和*) 加了星號(hào)(*) 表示跳過(guò)此數(shù)據(jù)不讀入. (也就是不把此數(shù)據(jù)讀入?yún)?shù)中) 的() 與 的() 雖然相似, 但仍有不同之處. 的() 不需要(也不可) 提供變量的內(nèi)存位址給(), 只需要給予變量的名字. 另一個(gè)不同點(diǎn)是, 的() 對(duì)于: ( , , , ); 的語(yǔ)法, 將會(huì)把中的第一個(gè)英文單字(即第一個(gè)空白字符以前的內(nèi)容) 讀入, 后面其余的內(nèi)容讀入.0YujC。0YujC。() 會(huì)返回符合格式的 和 總數(shù).以前曾經(jīng)編寫(xiě)過(guò)這樣的小程序:一個(gè)文本文件,每行是一條記錄,每條記錄中包含多個(gè)字段,每個(gè)字段之間以某種定界符分開(kāi),舉例如下:eUts8。eUts8。 (各字段以逗號(hào)分隔,內(nèi)容依次是:物品名稱,生產(chǎn)廠家,型號(hào),數(shù)量,價(jià)格)如果要對(duì)這樣的一行記錄進(jìn)行處理,提取出各個(gè)字段,怎么做比較好呢?我以前的做法是在一個(gè)循環(huán)中用函數(shù)每次取一個(gè)字段,然后將內(nèi)容保存到一個(gè)字符串?dāng)?shù)組中。這樣做雖然可行,但我總感覺(jué)寫(xiě)出的代碼有些啰嗦。sQsAE。sQsAE。最近看到一段代碼,用的標(biāo)準(zhǔn)庫(kù)函數(shù),處理這樣的數(shù)據(jù),只需一行就可以了。我把代碼整理了一下,去掉了無(wú)關(guān)的部分,核心部分如下:GMsIa。GMsIa。 ; ; , ; , ; (, );(, , );(, , , , , );下面簡(jiǎn)單做些解說(shuō): 最多讀入個(gè)字符,直到遇見(jiàn)定界符,但不包含定界符 讀入一個(gè)浮點(diǎn)數(shù),直到遇見(jiàn)定界符 讀入一個(gè)整數(shù),直到遇見(jiàn)定界符 最多讀入個(gè)字符,忽略行尾的回車(chē)符是不是很簡(jiǎn)潔明了呢? () ; ; ; ; ; ; ; ; ; ; ; ;(, );();();();();();();();(, );();();(, $);();();();();();();(); ; * 流行音樂(lè)專(zhuān)用;上面是源串,我要分別得到,流行音樂(lè)專(zhuān)用字段注意:因?yàn)檫@幾個(gè)字段的值會(huì)變化,所以我要用格

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論