欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語(yǔ)言 超詳細(xì)講解庫(kù)函數(shù)

 更新時(shí)間:2022年03月25日 14:50:10   作者:鹿九丸  
C語(yǔ)言庫(kù)函數(shù)是把自定義函數(shù)放到庫(kù)里,是別人把一些常用到的函數(shù)編完放到一個(gè)文件里,供程序員使用,下面讓我們一起來(lái)詳細(xì)了解它

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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論