C語(yǔ)言 超詳細(xì)講解庫(kù)函數(shù)
1 返回整數(shù)的getchar函數(shù)
代碼:
#include<stdio.h> int main() { char c; while((c = getchar())!=EOF)//getchar函數(shù)的返回值為整型 putchar(c); return 0; }
上述代碼有三種可能:
- 某些合法的輸入字符在被“截?cái)唷焙笫沟胏的取值與EOF相同,程序?qū)⒃趶?fù)制的中途停止。
- c根本不可能取到EOF這個(gè)值,陷入死循環(huán)。
- 程序表面上能夠正常工作,但完全是因?yàn)榍珊稀1M管函數(shù)geutchar的返回結(jié)果在賦給char類型的變量c時(shí)會(huì)發(fā)生“截?cái)唷辈僮?,但在許多編譯器下,它們?cè)诒容^表達(dá)式中并不是比較c與EOF,而是比較getchar函數(shù)的返回值與EOF!,如果編譯器采取的是這種做法,上面的例子就能夠正常運(yùn)行了。
2 更新順序文件
在使用r+同時(shí)進(jìn)行寫(xiě)入和讀出文件的操作時(shí),要使用fseek移動(dòng)指針才行,因?yàn)樵谶M(jìn)行寫(xiě)入和讀取的同時(shí),文件指針指向的位置發(fā)生了改變。
3 緩沖輸出與內(nèi)存分配
程序輸出有兩種方式:一種是即時(shí)處理方式;另一種是先暫存起來(lái),然后再大塊寫(xiě)入的方式。
setbuf(stdout,buf);
語(yǔ)句將通知輸入/輸出庫(kù)。所有寫(xiě)入stdout的輸出都應(yīng)該使用buf作為輸出緩沖區(qū),直到buf緩沖區(qū)被填滿或者程序員直接調(diào)用fflush(對(duì)于由寫(xiě)操作打開(kāi)的文件,調(diào)用fflush將導(dǎo)致輸出緩沖區(qū)的內(nèi)容被實(shí)際的寫(xiě)入該文件),buf緩沖區(qū)種的內(nèi)容才實(shí)際的寫(xiě)入stdout中。緩沖區(qū)的大小由系統(tǒng)頭文件<stdio.h>中的BUFSIZ定義。
下面是實(shí)例:
#include<stdio.h> int main() { int c; char buf[BUFSIZ]; setbuf(stdout,buf); while((c = getchar())!=EOF) putchar(c); }
上面這個(gè)程序是錯(cuò)誤的,因?yàn)閎uf緩沖區(qū)最后一次清空是再main()函數(shù)結(jié)束之后,在將控制權(quán)交給操作系統(tǒng)之前,C運(yùn)行時(shí)庫(kù)所必須進(jìn)行清理工作的一部分。但是,在此之前buf字符數(shù)組已經(jīng)被釋放。
兩種解決方案:
static char buf[BUFSIZ];
setbuf(stdout,(char*)malloc(BUFSIZ)); //此處不需要檢查malloc函數(shù)調(diào)用是否成功,因?yàn)閟etbuf函數(shù)的第二個(gè)參數(shù)取值可以為NULL,此時(shí)標(biāo)準(zhǔn)輸出不需要進(jìn)行緩沖。
4 庫(kù)函數(shù)
C語(yǔ)言實(shí)現(xiàn)中包括signal庫(kù)函數(shù),將其作為捕獲異步時(shí)間的一種方式。
#include<signal.h>//需要引用的頭文件 signal(signal type , handler function);
這里的signal type代表系統(tǒng)頭文件signal.h中定義的某些常量,這些常量用來(lái)標(biāo)識(shí)signal函數(shù)將要捕獲的信號(hào)類型。這里的handler function是當(dāng)指定的事件發(fā)生時(shí),將要加以調(diào)用的事件處理函數(shù)。
注意:信號(hào)甚至可能出現(xiàn)在某些復(fù)雜庫(kù)函數(shù)(如malloc)的執(zhí)行過(guò)程中。。因此,從安全的角度考慮,信號(hào)的處理函數(shù)不應(yīng)該調(diào)用上述類型的庫(kù)函數(shù)。
例如:假設(shè)malloc函數(shù)的執(zhí)行過(guò)程被一個(gè)信號(hào)中斷。此時(shí),malloc用來(lái)跟中可用內(nèi)存的數(shù)據(jù)結(jié)構(gòu)很可能只有部分被更新。如果signal處理函數(shù)再調(diào)用malloc函數(shù),結(jié)果可能是malloc函數(shù)用到的數(shù)據(jù)結(jié)構(gòu)完全崩潰,后果不堪設(shè)想。
結(jié)論:信號(hào)非常復(fù)雜棘手,而且具有一些從本質(zhì)上而言不可移植的特性。所以我們應(yīng)該讓signal處理的函數(shù)盡可能的簡(jiǎn)單,并將它們組織在一起,這樣,當(dāng)需要適應(yīng)一個(gè)新系統(tǒng)時(shí),我們可以很容易的進(jìn)行修改。
練習(xí)
問(wèn):當(dāng)一個(gè)程序異常終止時(shí),程序輸出的最后幾行常常會(huì)丟失,原因是什么?我們能夠采用怎樣的措施來(lái)解決這個(gè)問(wèn)題?
答:一個(gè)異常終止的程序可能沒(méi)有機(jī)會(huì)來(lái)清空輸出其緩沖區(qū),因此,該程序生成的輸出可能位于內(nèi)存中的某個(gè)位置,但卻永遠(yuǎn)不會(huì)被寫(xiě)出了。在某些系統(tǒng)上,這些無(wú)法被寫(xiě)出的輸出數(shù)據(jù)可能長(zhǎng)達(dá)好幾頁(yè)。
對(duì)于調(diào)試這類程序的編程人員來(lái)說(shuō),這種丟失輸出的情況經(jīng)常會(huì)誤導(dǎo)他們,因?yàn)檫@會(huì)造成這樣一種印象,即程序發(fā)生失敗的時(shí)刻比實(shí)際上運(yùn)行失敗的真正時(shí)刻要早得多。**解決方案就是在調(diào)試時(shí)強(qiáng)制不允許對(duì)輸出進(jìn)行緩沖。**解決方案如下:
setbuf(stdout,(char*)0);
這個(gè)語(yǔ)句必須在任何輸出被寫(xiě)入stdout(包括任何對(duì)printf函數(shù)的調(diào)用)之前執(zhí)行。該語(yǔ)句最恰當(dāng)?shù)奈恢镁褪亲鳛閙ain函數(shù)的第一個(gè)語(yǔ)句。
下面程序的作用是把它的輸入復(fù)制到輸出:
#include<stdio.h> int main() { register int c; while((c = getchar())!=EOF) putchar(c); return 0; }
把代碼改為下面的代碼,程序依然能夠正確運(yùn)行,但是慢了許多,這是為什么?
#define EOF -1 int main() { register int c; while((c = getchar())!=EOF) putchar(); return 0; }
函數(shù)調(diào)用需要花費(fèi)較長(zhǎng)的程序執(zhí)行時(shí)間,因此getchar常常被實(shí)現(xiàn)為宏。這個(gè)在stdio.h中定義,因此一個(gè)程序沒(méi)有包含stdio.h頭文件,在所有fgetchar宏出現(xiàn)的地方,都用getchar函數(shù)調(diào)用來(lái)替換getchar宏。這個(gè)程序之所以變慢,就是因?yàn)楹瘮?shù)調(diào)用所導(dǎo)致的開(kāi)銷增多。同樣的依據(jù)也適用于putchar。
到此這篇關(guān)于C語(yǔ)言 超詳細(xì)講解庫(kù)函數(shù)的使用方法的文章就介紹到這了,更多相關(guān)C語(yǔ)言 庫(kù)函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C語(yǔ)言庫(kù)函數(shù)qsort的使用詳解
- C語(yǔ)言常用庫(kù)函數(shù)的使用及模擬實(shí)現(xiàn)詳解例舉
- C語(yǔ)言庫(kù)函數(shù)中qsort()的用法
- C語(yǔ)言strcpy庫(kù)函數(shù)詳解
- 實(shí)現(xiàn)C語(yǔ)言常用字符串庫(kù)函數(shù)
- C語(yǔ)言實(shí)現(xiàn)常用字符串庫(kù)函數(shù)(推薦)
- 一篇文章帶你實(shí)現(xiàn)C語(yǔ)言中常用庫(kù)函數(shù)的模擬
- 一篇文章教你自己動(dòng)手實(shí)現(xiàn)C語(yǔ)言庫(kù)函數(shù)
- C語(yǔ)言模擬實(shí)現(xiàn)庫(kù)函數(shù)詳解
相關(guān)文章
C++ 中二分查找遞歸非遞歸實(shí)現(xiàn)并分析
這篇文章主要介紹了C++ 中二分查找遞歸非遞歸實(shí)現(xiàn)并分析的相關(guān)資料,需要的朋友可以參考下2017-06-06基于curses庫(kù)實(shí)現(xiàn)彈球游戲
這篇文章主要為大家詳細(xì)介紹了基于curses庫(kù)實(shí)現(xiàn)彈球游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之 折半查找實(shí)例詳解
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之 折半查找實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06C語(yǔ)言入門(mén)篇--關(guān)鍵字static詳解
本篇文章是C語(yǔ)言系列基礎(chǔ)篇,C語(yǔ)言中,static是用來(lái)修飾變量和函數(shù):1.修飾局部變量–>靜態(tài)局部變量2.修飾全局變量–>靜態(tài)全局變量3.修飾函數(shù)–>靜態(tài)函數(shù)2021-08-08opencv3/C++ 使用Tracker實(shí)現(xiàn)簡(jiǎn)單目標(biāo)跟蹤
今天小編就為大家分享一篇opencv3/C++ 使用Tracker實(shí)現(xiàn)簡(jiǎn)單目標(biāo)跟蹤,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12