最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2022年03月25日 14:50:10   作者:鹿九丸  
C語言庫函數(shù)是把自定義函數(shù)放到庫里,是別人把一些常用到的函數(shù)編完放到一個(gè)文件里,供程序員使用,下面讓我們一起來詳細(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)榍珊?。盡管函數(shù)geutchar的返回結(jié)果在賦給char類型的變量c時(shí)會(huì)發(fā)生“截?cái)唷辈僮鳎谠S多編譯器下,它們在比較表達(dá)式中并不是比較c與EOF,而是比較getchar函數(shù)的返回值與EOF!,如果編譯器采取的是這種做法,上面的例子就能夠正常運(yùn)行了。

2 更新順序文件

在使用r+同時(shí)進(jìn)行寫入和讀出文件的操作時(shí),要使用fseek移動(dòng)指針才行,因?yàn)樵谶M(jìn)行寫入和讀取的同時(shí),文件指針指向的位置發(fā)生了改變。

3 緩沖輸出與內(nèi)存分配

程序輸出有兩種方式:一種是即時(shí)處理方式;另一種是先暫存起來,然后再大塊寫入的方式。

setbuf(stdout,buf);

語句將通知輸入/輸出庫。所有寫入stdout的輸出都應(yīng)該使用buf作為輸出緩沖區(qū),直到buf緩沖區(qū)被填滿或者程序員直接調(diào)用fflush(對于由寫操作打開的文件,調(diào)用fflush將導(dǎo)致輸出緩沖區(qū)的內(nèi)容被實(shí)際的寫入該文件),buf緩沖區(qū)種的內(nèi)容才實(shí)際的寫入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í)庫所必須進(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 庫函數(shù)

C語言實(shí)現(xiàn)中包括signal庫函數(shù),將其作為捕獲異步時(shí)間的一種方式。

#include<signal.h>//需要引用的頭文件
signal(signal type , handler function);

這里的signal type代表系統(tǒng)頭文件signal.h中定義的某些常量,這些常量用來標(biāo)識(shí)signal函數(shù)將要捕獲的信號(hào)類型。這里的handler function是當(dāng)指定的事件發(fā)生時(shí),將要加以調(diào)用的事件處理函數(shù)。

注意:信號(hào)甚至可能出現(xiàn)在某些復(fù)雜庫函數(shù)(如malloc)的執(zhí)行過程中。。因此,從安全的角度考慮,信號(hào)的處理函數(shù)不應(yīng)該調(diào)用上述類型的庫函數(shù)。

例如:假設(shè)malloc函數(shù)的執(zhí)行過程被一個(gè)信號(hào)中斷。此時(shí),malloc用來跟中可用內(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ù)盡可能的簡單,并將它們組織在一起,這樣,當(dāng)需要適應(yīng)一個(gè)新系統(tǒng)時(shí),我們可以很容易的進(jìn)行修改。

練習(xí)

問:當(dāng)一個(gè)程序異常終止時(shí),程序輸出的最后幾行常常會(huì)丟失,原因是什么?我們能夠采用怎樣的措施來解決這個(gè)問題?

答:一個(gè)異常終止的程序可能沒有機(jī)會(huì)來清空輸出其緩沖區(qū),因此,該程序生成的輸出可能位于內(nèi)存中的某個(gè)位置,但卻永遠(yuǎn)不會(huì)被寫出了。在某些系統(tǒng)上,這些無法被寫出的輸出數(shù)據(jù)可能長達(dá)好幾頁。

對于調(diào)試這類程序的編程人員來說,這種丟失輸出的情況經(jīng)常會(huì)誤導(dǎo)他們,因?yàn)檫@會(huì)造成這樣一種印象,即程序發(fā)生失敗的時(shí)刻比實(shí)際上運(yùn)行失敗的真正時(shí)刻要早得多。**解決方案就是在調(diào)試時(shí)強(qiáng)制不允許對輸出進(jìn)行緩沖。**解決方案如下:

setbuf(stdout,(char*)0);

這個(gè)語句必須在任何輸出被寫入stdout(包括任何對printf函數(shù)的調(diào)用)之前執(zhí)行。該語句最恰當(dāng)?shù)奈恢镁褪亲鳛閙ain函數(shù)的第一個(gè)語句。

下面程序的作用是把它的輸入復(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í)行時(shí)間,因此getchar常常被實(shí)現(xiàn)為宏。這個(gè)在stdio.h中定義,因此一個(gè)程序沒有包含stdio.h頭文件,在所有fgetchar宏出現(xiàn)的地方,都用getchar函數(shù)調(diào)用來替換getchar宏。這個(gè)程序之所以變慢,就是因?yàn)楹瘮?shù)調(diào)用所導(dǎo)致的開銷增多。同樣的依據(jù)也適用于putchar。

到此這篇關(guān)于C語言 超詳細(xì)講解庫函數(shù)的使用方法的文章就介紹到這了,更多相關(guān)C語言 庫函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • QT實(shí)現(xiàn)圖片輪播

    QT實(shí)現(xiàn)圖片輪播

    這篇文章主要介紹了QT實(shí)現(xiàn)圖片輪播,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • C/C++ 中的預(yù)處理器指令及用法詳解

    C/C++ 中的預(yù)處理器指令及用法詳解

    本文介紹了C/C++預(yù)處理器指令的用途和示例,包括包含頭文件、定義宏、條件編譯、取消宏定義和#pragma指令等,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • Qt槽函數(shù)會(huì)被執(zhí)行多次的問題原因及解決方法

    Qt槽函數(shù)會(huì)被執(zhí)行多次的問題原因及解決方法

    本文主要介紹了Qt槽函數(shù)會(huì)被執(zhí)行多次的問題原因及解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • C語言中獲取文件狀態(tài)的相關(guān)函數(shù)小結(jié)

    C語言中獲取文件狀態(tài)的相關(guān)函數(shù)小結(jié)

    這篇文章主要介紹了C語言中獲取文件狀態(tài)的相關(guān)函數(shù)小結(jié),包括stat()函數(shù)和fstat()函數(shù)以及l(fā)stat()函數(shù)的使用,需要的朋友可以參考下
    2015-09-09
  • 詳解C++中動(dòng)態(tài)內(nèi)存管理和泛型編程

    詳解C++中動(dòng)態(tài)內(nèi)存管理和泛型編程

    這篇文章主要為大家詳細(xì)介紹了C++中動(dòng)態(tài)內(nèi)存管理和泛型編程的相關(guān)資料,文中示例代碼講解詳細(xì),對我們學(xué)習(xí)C++具有一定幫助,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一
    2022-10-10
  • C語言之快速排序案例詳解

    C語言之快速排序案例詳解

    這篇文章主要介紹了C語言之快速排序案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C/C++ 淺拷貝和深拷貝的實(shí)例詳解

    C/C++ 淺拷貝和深拷貝的實(shí)例詳解

    這篇文章主要介紹了C/C++ 淺拷貝和深拷貝的實(shí)例詳解的相關(guān)資料,幫助大家理解這部分知識(shí)提供了基礎(chǔ)知識(shí)及實(shí)例,需要的朋友可以參考下
    2017-08-08
  • QT+OpenCV實(shí)現(xiàn)錄屏功能

    QT+OpenCV實(shí)現(xiàn)錄屏功能

    這篇文章主要為大家詳細(xì)介紹了QT+OpenCV實(shí)現(xiàn)錄屏功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Qt利用ImageWatch實(shí)現(xiàn)圖片查看功能

    Qt利用ImageWatch實(shí)現(xiàn)圖片查看功能

    Visual Studio有專門針對OpenCV開發(fā)的插件,名叫ImageWatch,圖片放大之后可以查看RGB的像素值。本文將利用這一查件實(shí)現(xiàn)圖片查看功能,需要的可以參考一下
    2022-04-04
  • 詳解C++成員函數(shù)的override和final說明符的用法

    詳解C++成員函數(shù)的override和final說明符的用法

    這篇文章主要介紹了詳解C++成員函數(shù)的override和final說明符的用法,分別用于重寫和禁止繼承類,要的朋友可以參考下
    2016-01-01

最新評(píng)論

萨嘎县| 胶州市| 奎屯市| 阿合奇县| 锦屏县| 金堂县| 石台县| 平乡县| 八宿县| 禄丰县| 通许县| 萨嘎县| 凌海市| 石景山区| 米脂县| 淮安市| 平泉县| 泰和县| 贵定县| 旬阳县| 秦安县| 邵武市| 吉林省| 寿宁县| 龙游县| 阳泉市| 偏关县| 墨竹工卡县| 黄大仙区| 和林格尔县| 离岛区| 苗栗县| 合山市| 灵山县| 平阳县| 广宗县| 桑日县| 绍兴市| 哈巴河县| 元阳县| 济源市|