庫函數(shù)(Library function)是把函數(shù)放到庫里,供別人使用的一種方式。.方法是把一些常用到的函數(shù)編完放到一個(gè)文件里,供不同的人進(jìn)行調(diào)用。調(diào)用的時(shí)候把它所在的文件名用#include加到里面就可以了。一般是放到lib文件里的。
創(chuàng)新互聯(lián)為企業(yè)級(jí)客戶提高一站式互聯(lián)網(wǎng)+設(shè)計(jì)服務(wù),主要包括成都網(wǎng)站建設(shè)、網(wǎng)站制作、手機(jī)APP定制開發(fā)、小程序開發(fā)、宣傳片制作、LOGO設(shè)計(jì)等,幫助客戶快速提升營銷能力和企業(yè)形象,創(chuàng)新互聯(lián)各部門都有經(jīng)驗(yàn)豐富的經(jīng)驗(yàn),可以確保每一個(gè)作品的質(zhì)量和創(chuàng)作周期,同時(shí)每年都有很多新員工加入,為我們帶來大量新的創(chuàng)意。
一般是指編譯器提供的可在c源程序中調(diào)用的函數(shù)??煞譃閮深悾活愂莄語言標(biāo)準(zhǔn)規(guī)定的庫函數(shù),一類是編譯器特定的庫函數(shù)。
由于版權(quán)原因,庫函數(shù)的源代碼一般是不可見的,但在頭文件中你可以看到它對(duì)外的接口
庫函數(shù)簡介。
C語言的語句十分簡單,如果要使用C語言的語句直接計(jì)算sin或cos函數(shù),就需要編寫頗為復(fù)雜的程序。因?yàn)镃語言的語句中沒有提供直接計(jì)算sin或cos函數(shù)的語句。又如為了顯示一段文字,我們?cè)贑語言中也找不到顯示語句,只能使用庫函數(shù)printf。
C語言的庫函數(shù)并不是C語言本身的一部分,它是由編譯程序根據(jù)一般用戶的需要編制并提供用戶使用的一組程序。C的庫函數(shù)極大地方便了用戶,同時(shí)也補(bǔ)充了C語言本身的不足。事實(shí)上,在編寫C語言程序時(shí),應(yīng)當(dāng)盡可能多地使用庫函數(shù),這樣既可以提高程序的運(yùn)行效率,又可以提高編程的質(zhì)量。
這里調(diào)用的是靜態(tài)庫。
函數(shù)庫:函數(shù)庫是由系統(tǒng)建立的具有一定功能的函數(shù)的集合。庫中存放函數(shù)的名稱和對(duì)應(yīng)的目標(biāo)代碼,以及連接過程中所需的重定位信息。用戶也可以根據(jù)自己的需要建立自己的用戶函數(shù)庫。
庫函數(shù):存放在函數(shù)庫中的函數(shù)。庫函數(shù)具有明確的功能、入口調(diào)用參數(shù)和返回值。
連接程序:將編譯程序生成的目標(biāo)文件連接在一起生成一個(gè)可執(zhí)行文件。
頭文件:有時(shí)也稱為包含文件。C語言庫函數(shù)與用戶程序之間進(jìn)行信息通信時(shí)要使用的數(shù)據(jù)和變量,在使用某一庫函數(shù)時(shí),都要在程序中嵌入(用#include)該函數(shù)對(duì)應(yīng)的頭文件。
由于C語言編譯系統(tǒng)應(yīng)提供的函數(shù)庫尚無國際標(biāo)準(zhǔn)。不同版本的C語言具有不同的庫函數(shù),用戶使用時(shí)應(yīng)查閱有關(guān)版本的C的庫函數(shù)參考手冊(cè)。我們以Turbo C為例簡介一下C的庫函數(shù),并附錄中給出了Turbo C的部分常用庫函數(shù)。
大家都知道我們可以使用C語言寫一段程序來控制硬件工作,但你知道其工作原理嗎?以下僅供參考!
c語言在實(shí)際運(yùn)行中,都是以匯編指令的方式運(yùn)行的,由編譯器把C語言編譯成匯編指令,CPU直接執(zhí)行匯編指令。
所以這個(gè)問題就變成,匯編指令是如何操作硬件的?
如果把硬件平臺(tái)限制在x86環(huán)境下,那么匯編指令操作硬件基本上只有兩種方式:
方式一:
通過向內(nèi)存空間寫數(shù)據(jù)。硬件會(huì)把硬件上的各種寄存器(外行可以理解為訪問硬件的接口或者操作硬件的工具)映射到某一塊內(nèi)存地址空間上,之后只要用匯編指令,甚至C語言去讀寫這一段內(nèi)存地址空間(并非真正操作物理內(nèi)存),就可以達(dá)到操作硬件的目的了。
如果題主還有WindowsXP環(huán)境(虛擬機(jī)也可以),就可以用匯編指令直接操作顯存:
MOV AX,B800
MOV ES,AX
XOR DI,DI
MOV CX,0800
MOV AX,5555
REPZ STOSB
硬件的各種寄存器會(huì)被映射到某一塊物理內(nèi)存中,這種方式稱為MMIO,在Windows的設(shè)備管理器里,右鍵點(diǎn)設(shè)備,看屬性-》資源里,不少硬件設(shè)備都有“內(nèi)存范圍”的參數(shù),這里的內(nèi)存范圍就表示這個(gè)硬件的資源可以通過訪問這一段內(nèi)存來控制它。
方式二:
x86匯編中,還有兩個(gè)特殊的指令是IN和OUT,這是x86平臺(tái)上獨(dú)有的,上面圖里的I/O范圍,就是用IN/OUT這兩個(gè)指令來訪問和控制的。
以上兩種訪問硬件的方式,第一種是可以用C語言實(shí)現(xiàn)的,上面一段匯編,本質(zhì)上類似于C語言代碼:
char ptr = 0xB8000;
int i;
for (i = 0; i 《0x800; i++)
{ptr + i = 0x55;
}
第二種IN/OUT方式?jīng)]有直接的C語言語法對(duì)應(yīng),需要自己封裝匯編。
那么為什么平時(shí)很難用C語言操作硬件呢?這是因?yàn)槠綍r(shí)寫的代碼大多數(shù)都在保護(hù)模式下,保護(hù)模式下,直接訪問物理地址會(huì)受到限制,C語言操作的地址都是虛地址。
對(duì)于Windows來說,要訪問物理地址,需要工作在內(nèi)核模式,也就是的寫驅(qū)動(dòng)才行。
而在顯存方面,首先,題主要先明白物理地址和虛擬地址的概念。
原來的8086cpu設(shè)計(jì)的時(shí)候,地址空間有一塊區(qū)域(640K-1M)之間,有一塊作為顯存使用
這里你說的預(yù)留的地址,是指物理地址,這一段地址的準(zhǔn)確范圍是000A0000-000BFFFF,不管是32位還是64位CPU,這一段物理內(nèi)存地址一直都保留給顯存使用,不區(qū)分32位還是64位,也不區(qū)分保護(hù)模式還是實(shí)模式。
可見這一段內(nèi)存至今仍然是留給顯卡使用的。
那么現(xiàn)在為什么不能直接用這段內(nèi)存了?
因?yàn)楝F(xiàn)在的軟件都運(yùn)行在保護(hù)模式下,訪問的地址都是虛擬地址,而并非物理地址,包括你使用cmd命令打開的環(huán)境,都是虛擬地址,雖然32位XP里能用debug命令向000B8000上寫數(shù)據(jù)并能顯示在cmd的界面里,但本質(zhì)上,這都是虛擬出來的。
如果要想用這段顯存怎么辦?
自己寫一個(gè)簡易的操作系統(tǒng),不啟動(dòng)顯卡的各種圖形加速功能,CPU進(jìn)入保護(hù)模式后在GDT里映射一個(gè)4G的數(shù)據(jù)段,與物理地址一致,那么向000B8000上寫數(shù)據(jù),就會(huì)像過去DOS一樣顯示在屏幕上,所以保護(hù)模式下也可以訪問這一段內(nèi)存。所以,保護(hù)模式下,也可以用它。
顯卡那么多顯存是怎么映射的?
有很多內(nèi)存地址被映射給顯存了,就是通過這種映射關(guān)系,把一些物理地址留給顯存,使得CPU能像訪問內(nèi)存一樣訪問顯存資源。
當(dāng)然,實(shí)際情況是,2G顯存未必完全映射,而是只映射一部分地址,顯卡有一些開放的寄存器能夠控制哪部分顯存映射過來,這樣就能使得CPU在使用比較少的物理地址范圍的情況下,訪問全部的顯存。
還有一個(gè)很有意思的事情:在虛擬機(jī)里,找到映射的高地址部分的第一塊內(nèi)存區(qū)域,寫一個(gè)能直接訪問物理地址的程序(比如一個(gè)驅(qū)動(dòng)),去讀這一塊內(nèi)存,然后寫到文件里,再用屏幕截圖,也寫到文件里,會(huì)發(fā)現(xiàn)截圖的內(nèi)容和顯存里讀出來的內(nèi)容基本上是一樣的。
網(wǎng)友a(bǔ)wayisblue
要回答你的問題,我們需要要知道:
硬件是一種什么樣的存在
什么是驅(qū)動(dòng)。
C語言怎么操作硬件
我就不嚴(yán)格去定義這些概念了,我就以一個(gè)例子來通俗地講解一下吧。
首先講硬件:
先介紹一款單片機(jī)芯片STM8。
這款芯片里面有cpu, 內(nèi)存,寄存器(先不要覺得看到新名詞壓力大,繼續(xù)往下看)等等,相當(dāng)于我們的電腦了,但還要外接其它硬件。
這里你需要知道的概念是:
芯片的引腳跟寄存器是相對(duì)應(yīng)的,寄存器是8位的內(nèi)存單元(對(duì),存在于內(nèi)存上面),當(dāng)你往這個(gè)內(nèi)存單元里面寫入數(shù)據(jù)時(shí),芯片的引腳的電壓會(huì)發(fā)生變化,比如說我寫入的是01100001,則芯片上與之對(duì)應(yīng)的8個(gè)引腳的電壓狀態(tài)(分為高電平與低電平兩種)會(huì)輸出:低高高低低低低高。
cpu可以執(zhí)行代碼指令,指令可以操作內(nèi)存。
結(jié)論:所以從上面兩點(diǎn)可以我們可以知道,cpu可以執(zhí)行指令,使芯片的引腳電平(電壓)發(fā)生變化。
關(guān)于這款顯示器,我們需要知道的是:
它是有引腳的,這些引腳可以跟到前面介紹的那款單片機(jī)芯片的引腳相連。
該顯示器有自帶的內(nèi)存,用于存儲(chǔ)要顯示的字符,顯示器從該內(nèi)存里面讀取字符來來顯示。
單片機(jī)芯片與該顯示器相連后,可以通過引腳往該顯示器的內(nèi)存里寫數(shù)據(jù)(通過多個(gè)引腳電平的高低不同來代表不同的數(shù)據(jù),比如說:低高高低低低低高 代表01100001,這個(gè)數(shù)據(jù)寫在顯示器的.內(nèi)存里面,被顯示器所顯示,當(dāng)然,會(huì)根據(jù)ASCII來顯示數(shù)字對(duì)應(yīng)的字符,01100001對(duì)應(yīng)的字符是‘a(chǎn)’),除了接收數(shù)據(jù)的引腳外,還有控制顯示器的引腳(這個(gè)我們會(huì)在驅(qū)動(dòng)那里介紹,繼續(xù)往下看)。
結(jié)論:單片機(jī)芯片與顯示器相連,可以通過引腳輸出的電平來控制顯示器的字符顯示。
那么,綜合上面,也就是說,單片機(jī)芯片cpu可以通過執(zhí)行指令來控制顯示器的字符顯示。
而這里,題主所說的硬件,指的就是這個(gè)顯示器了。
接下來講驅(qū)動(dòng):
那么,什么是驅(qū)動(dòng)呢?驅(qū)動(dòng)無非就是硬件跟軟件的中間層,但我們不糾結(jié)這種關(guān)系,直接來看一下,對(duì)于我們這個(gè)例子,驅(qū)動(dòng)指的是什么。首先我們要知道:
顯示器支持很多種操作,比如說清除顯示,光標(biāo)移動(dòng),讀取數(shù)據(jù),寫數(shù)據(jù)等等。
這些操作數(shù)據(jù)引腳和控制引腳來實(shí)現(xiàn)。
引腳可以通過單片機(jī)芯片來控制。
結(jié)論:我們可以通過在單片機(jī)芯片里面寫顯示器的“驅(qū)動(dòng)”程序來屏蔽掉硬件(顯示器硬件)層。
于是這里驅(qū)動(dòng)程序,指的是顯示器所支持操作的程序表示。比如說清除顯示,我們可以編寫一個(gè)clear()函數(shù),光標(biāo)移動(dòng),我們編寫一個(gè)move_cursor()函數(shù),讀取數(shù)據(jù)和寫數(shù)據(jù)分別為read()和write(),然后分別實(shí)現(xiàn)就可以了(通過向寄存器里寫數(shù)據(jù)的形式,進(jìn)而控制引腳的電平變化,再而控制顯示器,這個(gè)過程前面已有介紹)。這些函數(shù)就是驅(qū)動(dòng)程序了。為什么上面說驅(qū)動(dòng)程序可以屏蔽掉硬件呢?因?yàn)槌绦騿T可以使用前面的驅(qū)動(dòng)程序來直接操作顯示器(硬件),而不用知道太多關(guān)于硬件的事情,而一般的驅(qū)動(dòng)程序也可以由廠家來提供。
再說明一點(diǎn):一般這些驅(qū)動(dòng)程序可以用匯編寫(出于運(yùn)行效率的考慮),也可以用C語言來編寫的,比如說我上面的例子,就可以直接用C語言來編寫。當(dāng)然C語言內(nèi)聯(lián)匯編的形式也可以。
最后講C語言怎么操作硬件:
相信到這里,C語言是怎么操作硬件的已經(jīng)比較明白了。
這里總結(jié)一下:
C語言由CPU運(yùn)行(實(shí)際上是先編譯成機(jī)器碼存在芯片里面然后執(zhí)行),可以去操作內(nèi)存。
內(nèi)存里有一段是跟寄存器相對(duì)應(yīng)的,而寄存器是跟芯片的引腳相對(duì)應(yīng)的,于是操作該段內(nèi)存就能控制芯片引腳的電壓變化。
硬件(比如說顯示器)有引腳(或者說排線,這些也是一樣的東西),這些引腳跟芯片的引腳相連可以接受芯片的控制。
可以把對(duì)某個(gè)硬件的操作做成一系列操作函數(shù),這些操作函數(shù)就是驅(qū)動(dòng)程序了。
于是我們的C語言只要去調(diào)用這個(gè)驅(qū)動(dòng)程序就可以直接操作硬件了。(當(dāng)然驅(qū)動(dòng)程序也可以由C語言來編寫,所以C語言操作硬件并不一定要經(jīng)過驅(qū)動(dòng)程序)。
驅(qū)動(dòng)函數(shù)不是直接調(diào)用的,而是通過通訊完成調(diào)用的??梢詤⒖迹?/p>
BOOL?WINAPI?DeviceIoControl(
_In_?????????HANDLE?hDevice,
_In_?????????DWORD?dwIoControlCode,
_In_opt_?????LPVOID?lpInBuffer,
_In_?????????DWORD?nInBufferSize,
_Out_opt_????LPVOID?lpOutBuffer,
_In_?????????DWORD?nOutBufferSize,
_Out_opt_????LPDWORD?lpBytesReturned,
_Inout_opt_??LPOVERLAPPED?lpOverlapped
);
庫函數(shù)是做編譯器的人寫出來的,也是用C寫出來的,庫函數(shù)不屬于C語言的一個(gè)部分,是人們?yōu)榱耸笴用來寫程序時(shí)效率更高,而預(yù)先寫好的函數(shù),其實(shí)你也可以自己寫的。
printf(char *format,arg1,arg2,...),使用了可變長參數(shù)表
int isalpha(int ch) 若ch是字母('A'-'Z','a'-'z')返回非0值,否則返回0
int isalnum(int ch) 若ch是字母('A'-'Z','a'-'z')或數(shù)字('0'-'9')
返回非0值,否則返回0
int isascii(int ch) 若ch是字符(ASCII碼中的0-127)返回非0值,否則返回0
int iscntrl(int ch) 若ch是作廢字符(0x7F)或普通控制字符(0x00-0x1F)
返回非0值,否則返回0
int isdigit(int ch) 若ch是數(shù)字('0'-'9')返回非0值,否則返回0
int isgraph(int ch) 若ch是可打印字符(不含空格)(0x21-0x7E)返回非0值,否則返回0
int islower(int ch) 若ch是小寫字母('a'-'z')返回非0值,否則返回0
int isprint(int ch) 若ch是可打印字符(含空格)(0x20-0x7E)返回非0值,否則返回0
int ispunct(int ch) 若ch是標(biāo)點(diǎn)字符(0x00-0x1F)返回非0值,否則返回0
int isspace(int ch) 若ch是空格(' '),水平制表符('\t'),回車符('\r'),
走紙換行('\f'),垂直制表符('\v'),換行符('\n')
返回非0值,否則返回0
int isupper(int ch) 若ch是大寫字母('A'-'Z')返回非0值,否則返回0
int isxdigit(int ch) 若ch是16進(jìn)制數(shù)('0'-'9','A'-'F','a'-'f')返回非0值,
否則返回0
int tolower(int ch) 若ch是大寫字母('A'-'Z')返回相應(yīng)的小寫字母('a'-'z')
int toupper(int ch) 若ch是小寫字母('a'-'z')返回相應(yīng)的大寫字母('A'-'Z')
========數(shù)學(xué)函數(shù)(原型聲明所在頭文件為math.h、stdlib.h、string.h、float.h)===========
int abs(int i) 返回整型參數(shù)i的絕對(duì)值
double cabs(struct complex znum) 返回復(fù)數(shù)znum的絕對(duì)值
double fabs(double x) 返回雙精度參數(shù)x的絕對(duì)值
long labs(long n) 返回長整型參數(shù)n的絕對(duì)值
double exp(double x) 返回指數(shù)函數(shù)ex的值
double frexp(double value,int *eptr) 返回value=x*2n中x的值,n存貯在eptr中
double ldexp(double value,int exp); 返回value*2exp的值
double log(double x) 返回logex的值
double log10(double x) 返回log10x的值
double pow(double x,double y) 返回xy的值
double pow10(int p) 返回10p的值
double sqrt(double x) 返回x的開方
double acos(double x) 返回x的反余弦cos-1(x)值,x為弧度
double asin(double x) 返回x的反正弦sin-1(x)值,x為弧度
double atan(double x) 返回x的反正切tan-1(x)值,x為弧度
double atan2(double y,double x) 返回y/x的反正切tan-1(x)值,y的x為弧度
double cos(double x) 返回x的余弦cos(x)值,x為弧度
double sin(double x) 返回x的正弦sin(x)值,x為弧度
double tan(double x) 返回x的正切tan(x)值,x為弧度
double cosh(double x) 返回x的雙曲余弦cosh(x)值,x為弧度
double sinh(double x) 返回x的雙曲正弦sinh(x)值,x為弧度
double tanh(double x) 返回x的雙曲正切tanh(x)值,x為弧度
double hypot(double x,double y) 返回直角三角形斜邊的長度(z),
x和y為直角邊的長度,z2=x2+y2
double ceil(double x) 返回不小于x的最小整數(shù)
double floor(double x) 返回不大于x的最大整數(shù)
void srand(unsigned seed) 初始化隨機(jī)數(shù)發(fā)生器
int rand() 產(chǎn)生一個(gè)隨機(jī)數(shù)并返回這個(gè)數(shù)
double poly(double x,int n,double c[])從參數(shù)產(chǎn)生一個(gè)多項(xiàng)式
double modf(double value,double *iptr)將雙精度數(shù)value分解成尾數(shù)和階
double fmod(double x,double y) 返回x/y的余數(shù)
double frexp(double value,int *eptr) 將雙精度數(shù)value分成尾數(shù)和階
double atof(char *nptr) 將字符串nptr轉(zhuǎn)換成浮點(diǎn)數(shù)并返回這個(gè)浮點(diǎn)數(shù)
double atoi(char *nptr) 將字符串nptr轉(zhuǎn)換成整數(shù)并返回這個(gè)整數(shù)
double atol(char *nptr) 將字符串nptr轉(zhuǎn)換成長整數(shù)并返回這個(gè)整數(shù)
char *ecvt(double value,int ndigit,int *decpt,int *sign)
將浮點(diǎn)數(shù)value轉(zhuǎn)換成字符串并返回該字符串
char *fcvt(double value,int ndigit,int *decpt,int *sign)
將浮點(diǎn)數(shù)value轉(zhuǎn)換成字符串并返回該字符串
char *gcvt(double value,int ndigit,char *buf)
將數(shù)value轉(zhuǎn)換成字符串并存于buf中,并返回buf的指針
char *ultoa(unsigned long value,char *string,int radix)
將無符號(hào)整型數(shù)value轉(zhuǎn)換成字符串并返回該字符串,radix為轉(zhuǎn)換時(shí)所用基數(shù)
char *ltoa(long value,char *string,int radix)
將長整型數(shù)value轉(zhuǎn)換成字符串并返回該字符串,radix為轉(zhuǎn)換時(shí)所用基數(shù)
char *itoa(int value,char *string,int radix)
將整數(shù)value轉(zhuǎn)換成字符串存入string,radix為轉(zhuǎn)換時(shí)所用基數(shù)
double atof(char *nptr) 將字符串nptr轉(zhuǎn)換成雙精度數(shù),并返回這個(gè)數(shù),錯(cuò)誤返回0
int atoi(char *nptr) 將字符串nptr轉(zhuǎn)換成整型數(shù), 并返回這個(gè)數(shù),錯(cuò)誤返回0
long atol(char *nptr) 將字符串nptr轉(zhuǎn)換成長整型數(shù),并返回這個(gè)數(shù),錯(cuò)誤返回0
double strtod(char *str,char **endptr)將字符串str轉(zhuǎn)換成雙精度數(shù),并返回這個(gè)數(shù),
long strtol(char *str,char **endptr,int base)將字符串str轉(zhuǎn)換成長整型數(shù),
并返回這個(gè)數(shù),
int matherr(struct exception *e)
用戶修改數(shù)學(xué)錯(cuò)誤返回信息函數(shù)(沒有必要使用)
double _matherr(_mexcep why,char *fun,double *arg1p,
double *arg2p,double retval)
用戶修改數(shù)學(xué)錯(cuò)誤返回信息函數(shù)(沒有必要使用)
unsigned int _clear87() 清除浮點(diǎn)狀態(tài)字并返回原來的浮點(diǎn)狀態(tài)
void _fpreset() 重新初使化浮點(diǎn)數(shù)學(xué)程序包
unsigned int _status87() 返回浮點(diǎn)狀態(tài)字
============目錄函數(shù)(原型聲明所在頭文件為dir.h、dos.h)================
int chdir(char *path) 使指定的目錄path(如:"C:\\WPS")變成當(dāng)前的工作目錄,成
功返回0
int findfirst(char *pathname,struct ffblk *ffblk,int attrib)查找指定的文件,成功
返回0
pathname為指定的目錄名和文件名,如"C:\\WPS\\TXT"
ffblk為指定的保存文件信息的一個(gè)結(jié)構(gòu),定義如下:
┏━━━━━━━━━━━━━━━━━━┓
┃struct ffblk ┃
┃{ ┃
┃ char ff_reserved[21]; /*DOS保留字*/┃
┃ char ff_attrib; /*文件屬性*/ ┃
┃ int ff_ftime; /*文件時(shí)間*/ ┃
┃ int ff_fdate; /*文件日期*/ ┃
┃ long ff_fsize; /*文件長度*/ ┃
┃ char ff_name[13]; /*文件名*/ ┃
┃} ┃
┗━━━━━━━━━━━━━━━━━━┛
attrib為文件屬性,由以下字符代表
┏━━━━━━━━━┳━━━━━━━━┓
┃FA_RDONLY 只讀文件┃FA_LABEL 卷標(biāo)號(hào)┃
┃FA_HIDDEN 隱藏文件┃FA_DIREC 目錄 ┃
┃FA_SYSTEM 系統(tǒng)文件┃FA_ARCH 檔案 ┃
┗━━━━━━━━━┻━━━━━━━━┛
例:
struct ffblk ff;
findfirst("*.wps",ff,FA_RDONLY);
int findnext(struct ffblk *ffblk) 取匹配finddirst的文件,成功返回0
void fumerge(char *path,char *drive,char *dir,char *name,char *ext)
此函數(shù)通過盤符drive(C:、A:等),路徑dir(\TC、\BC\LIB等),
文件名name(TC、WPS等),擴(kuò)展名ext(.EXE、.COM等)組成一個(gè)文件名
存與path中.
int fnsplit(char *path,char *drive,char *dir,char *name,char *ext)
此函數(shù)將文件名path分解成盤符drive(C:、A:等),路徑dir(\TC、\BC\LIB等),
文件名name(TC、WPS等),擴(kuò)展名ext(.EXE、.COM等),并分別存入相應(yīng)的變量中.
int getcurdir(int drive,char *direc) 此函數(shù)返回指定驅(qū)動(dòng)器的當(dāng)前工作目錄名稱
drive 指定的驅(qū)動(dòng)器(0=當(dāng)前,1=A,2=B,3=C等)
direc 保存指定驅(qū)動(dòng)器當(dāng)前工作路徑的變量 成功返回0
char *getcwd(char *buf,iint n) 此函數(shù)取當(dāng)前工作目錄并存入buf中,直到n個(gè)字
節(jié)長為為止.錯(cuò)誤返回NULL
int getdisk() 取當(dāng)前正在使用的驅(qū)動(dòng)器,返回一個(gè)整數(shù)(0=A,1=B,2=C等)
int setdisk(int drive) 設(shè)置要使用的驅(qū)動(dòng)器drive(0=A,1=B,2=C等),
返回可使用驅(qū)動(dòng)器總數(shù)
int mkdir(char *pathname) 建立一個(gè)新的目錄pathname,成功返回0
int rmdir(char *pathname) 刪除一個(gè)目錄pathname,成功返回0
char *mktemp(char *template) 構(gòu)造一個(gè)當(dāng)前目錄上沒有的文件名并存于template中
char *searchpath(char *pathname) 利用MSDOS找出文件filename所在路徑,
,此函數(shù)使用DOS的PATH變量,未找到文件返回NULL
===========進(jìn)程函數(shù)(原型聲明所在頭文件為stdlib.h、process.h)===========
void abort() 此函數(shù)通過調(diào)用具有出口代碼3的_exit寫一個(gè)終止信息于stderr,
并異常終止程序。無返回值
int exec…裝入和運(yùn)行其它程序
int execl( char *pathname,char *arg0,char *arg1,…,char *argn,NULL)
int execle( char *pathname,char *arg0,char *arg1,…,
char *argn,NULL,char *envp[])
int execlp( char *pathname,char *arg0,char *arg1,…,NULL)
int execlpe(char *pathname,char *arg0,char *arg1,…,NULL,char *envp[])
int execv( char *pathname,char *argv[])
int execve( char *pathname,char *argv[],char *envp[])
int execvp( char *pathname,char *argv[])
int execvpe(char *pathname,char *argv[],char *envp[])
exec函數(shù)族裝入并運(yùn)行程序pathname,并將參數(shù)
arg0(arg1,arg2,argv[],envp[])傳遞給子程序,出錯(cuò)返回-1
在exec函數(shù)族中,后綴l、v、p、e添加到exec后,
所指定的函數(shù)將具有某種操作能力
有后綴 p時(shí),函數(shù)可以利用DOS的PATH變量查找子程序文件。
l時(shí),函數(shù)中被傳遞的參數(shù)個(gè)數(shù)固定。
v時(shí),函數(shù)中被傳遞的參數(shù)個(gè)數(shù)不固定。
e時(shí),函數(shù)傳遞指定參數(shù)envp,允許改變子進(jìn)程的環(huán)境,
無后綴e時(shí),子進(jìn)程使用當(dāng)前程序的環(huán)境。
void _exit(int status)終止當(dāng)前程序,但不清理現(xiàn)場
void exit(int status) 終止當(dāng)前程序,關(guān)閉所有文件,寫緩沖區(qū)的輸出(等待輸出),
并調(diào)用任何寄存器的"出口函數(shù)",無返回值
int spawn…運(yùn)行子程序
int spawnl( int mode,char *pathname,char *arg0,char *arg1,…,
char *argn,NULL)
int spawnle( int mode,char *pathname,char *arg0,char *arg1,…,
char *argn,NULL,char *envp[])
int spawnlp( int mode,char *pathname,char *arg0,char *arg1,…,
char *argn,NULL)
int spawnlpe(int mode,char *pathname,char *arg0,char *arg1,…,
char *argn,NULL,char *envp[])
int spawnv( int mode,char *pathname,char *argv[])
int spawnve( int mode,char *pathname,char *argv[],char *envp[])
int spawnvp( int mode,char *pathname,char *argv[])
int spawnvpe(int mode,char *pathname,char *argv[],char *envp[])
spawn函數(shù)族在mode模式下運(yùn)行子程序pathname,并將參數(shù)
arg0(arg1,arg2,argv[],envp[])傳遞給子程序.出錯(cuò)返回-1
mode為運(yùn)行模式
mode為 P_WAIT 表示在子程序運(yùn)行完后返回本程序
P_NOWAIT 表示在子程序運(yùn)行時(shí)同時(shí)運(yùn)行本程序(不可用)
P_OVERLAY表示在本程序退出后運(yùn)行子程序
在spawn函數(shù)族中,后綴l、v、p、e添加到spawn后,
所指定的函數(shù)將具有某種操作能力
有后綴 p時(shí), 函數(shù)利用DOS的PATH查找子程序文件
l時(shí), 函數(shù)傳遞的參數(shù)個(gè)數(shù)固定.
v時(shí), 函數(shù)傳遞的參數(shù)個(gè)數(shù)不固定.
e時(shí), 指定參數(shù)envp可以傳遞給子程序,允許改變子程序運(yùn)行環(huán)境.
當(dāng)無后綴e時(shí),子程序使用本程序的環(huán)境.
int system(char *command) 將MSDOS命令command傳遞給DOS執(zhí)行
======轉(zhuǎn)換子程序(函數(shù)原型所在頭文件為math.h、stdlib.h、ctype.h、float.h)========
char *ecvt(double value,int ndigit,int *decpt,int *sign)
將浮點(diǎn)數(shù)value轉(zhuǎn)換成字符串并返回該字符串
char *fcvt(double value,int ndigit,int *decpt,int *sign)
將浮點(diǎn)數(shù)value轉(zhuǎn)換成字符串并返回該字符串
char *gcvt(double value,int ndigit,char *buf)
將數(shù)value轉(zhuǎn)換成字符串并存于buf中,并返回buf的指針
char *ultoa(unsigned long value,char *string,int radix)
將無符號(hào)整型數(shù)value轉(zhuǎn)換成字符串并返回該字符串,radix為轉(zhuǎn)換時(shí)所用基數(shù)
char *ltoa(long value,char *string,int radix)
將長整型數(shù)value轉(zhuǎn)換成字符串并返回該字符串,radix為轉(zhuǎn)換時(shí)所用基數(shù)
char *itoa(int value,char *string,int radix)
將整數(shù)value轉(zhuǎn)換成字符串存入string,radix為轉(zhuǎn)換時(shí)所用基數(shù)
double atof(char *nptr) 將字符串nptr轉(zhuǎn)換成雙精度數(shù),并返回這個(gè)數(shù),錯(cuò)誤返回0
int atoi(char *nptr) 將字符串nptr轉(zhuǎn)換成整型數(shù), 并返回這個(gè)數(shù),錯(cuò)誤返回0
long atol(char *nptr) 將字符串nptr轉(zhuǎn)換成長整型數(shù),并返回這個(gè)數(shù),錯(cuò)誤返回0
double strtod(char *str,char **endptr)將字符串str轉(zhuǎn)換成雙精度數(shù),并返回這個(gè)數(shù),
long strtol(char *str,char **endptr,int base)將字符串str轉(zhuǎn)換成長整型數(shù),
并返回這個(gè)數(shù),
int toascii(int c) 返回c相應(yīng)的ASCII
int tolower(int ch) 若ch是大寫字母('A'-'Z')返回相應(yīng)的小寫字母('a'-'z')
int _tolower(int ch) 返回ch相應(yīng)的小寫字母('a'-'z')
int toupper(int ch) 若ch是小寫字母('a'-'z')返回相應(yīng)的大寫字母('A'-'Z')
int _toupper(int ch) 返回ch相應(yīng)的大寫字母('A'-'Z')
最低0.27元/天開通百度文庫會(huì)員,可在文庫查看完整內(nèi)容
原發(fā)布者:shimingtime
附錄CC語言常用的庫函數(shù)庫函數(shù)并不是C語言的一部分,它是由編譯系統(tǒng)根據(jù)一般用戶的需要編制并提供給用戶使用的一組程序。每一種C編譯系統(tǒng)都提供了一批庫函數(shù),不同的編譯系統(tǒng)所提供的庫函數(shù)的數(shù)目和函數(shù)名以及函數(shù)功能是不完全相同的。ANSIC標(biāo)準(zhǔn)提出了一批建議提供的標(biāo)準(zhǔn)庫函數(shù)。它包括了目前多數(shù)C編譯系統(tǒng)所提供的庫函數(shù),但也有一些是某些C編譯系統(tǒng)未曾實(shí)現(xiàn)的??紤]到通用性,本附錄列出ANSIC建議的常用庫函數(shù)。由于C庫函數(shù)的種類和數(shù)目很多,例如還有屏幕和圖形函數(shù)、時(shí)間日期函數(shù)、與系統(tǒng)有關(guān)的函數(shù)等,每一類函數(shù)又包括各種功能的函數(shù),限于篇幅,本附錄不能全部介紹,只從教學(xué)需要的角度列出最基本的。讀者在編寫C程序時(shí)可根據(jù)需要,查閱有關(guān)系統(tǒng)的函數(shù)使用手冊(cè)。1.?dāng)?shù)學(xué)函數(shù)使用數(shù)學(xué)函數(shù)時(shí),應(yīng)該在源文件中使用預(yù)編譯命令:#include或#include"math.h"2.字符函數(shù)在使e68a84e8a2ade799bee5baa631333433623761用字符函數(shù)時(shí),應(yīng)該在源文件中使用預(yù)編譯命令:#include或#include"ctype.h"3.字符串函數(shù)使用字符串中函數(shù)時(shí),應(yīng)該在源文件中使用預(yù)編譯命令:#include或#include"string.h"4.輸入輸出函數(shù)在使用輸入輸出函數(shù)時(shí),應(yīng)該在源文件中使用預(yù)編譯命令:#include或#include"stdio.h"5.動(dòng)態(tài)存儲(chǔ)分配函數(shù)在使用動(dòng)態(tài)存儲(chǔ)分配函數(shù)時(shí),應(yīng)該在源文件中使用預(yù)編譯命令:#include或#include"stdlib.h"6.其他函數(shù)有些函數(shù)由于不便歸入某一類,所以單獨(dú)列出。使用這些
分享名稱:c語言硬件驅(qū)動(dòng)庫函數(shù),C語言控制硬件
標(biāo)題鏈接:http://sd-ha.com/article30/phhipo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、服務(wù)器托管、ChatGPT、商城網(wǎng)站、Google、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)