庫(kù)函數(shù)(Library function)是把函數(shù)放到庫(kù)里,供別人使用的一種方式。.方法是把一些常用到的函數(shù)編完放到一個(gè)文件里,供不同的人進(jìn)行調(diào)用。調(diào)用的時(shí)候把它所在的文件名用#include加到里面就可以了。一般是放到lib文件里的。
創(chuàng)新互聯(lián)公司是創(chuàng)新、創(chuàng)意、研發(fā)型一體的綜合型網(wǎng)站建設(shè)公司,自成立以來(lái)公司不斷探索創(chuàng)新,始終堅(jiān)持為客戶提供滿意周到的服務(wù),在本地打下了良好的口碑,在過(guò)去的十載時(shí)間我們累計(jì)服務(wù)了上千家以及全國(guó)政企客戶,如電動(dòng)窗簾等企業(yè)單位,完善的項(xiàng)目管理流程,嚴(yán)格把控項(xiàng)目進(jìn)度與質(zhì)量監(jiān)控加上過(guò)硬的技術(shù)實(shí)力獲得客戶的一致稱贊。
一般是指編譯器提供的可在c源程序中調(diào)用的函數(shù)??煞譃閮深悾活愂莄語(yǔ)言標(biāo)準(zhǔn)規(guī)定的庫(kù)函數(shù),一類是編譯器特定的庫(kù)函數(shù)。
由于版權(quán)原因,庫(kù)函數(shù)的源代碼一般是不可見(jiàn)的,但在頭文件中你可以看到它對(duì)外的接口
庫(kù)函數(shù)簡(jiǎn)介。
C語(yǔ)言的語(yǔ)句十分簡(jiǎn)單,如果要使用C語(yǔ)言的語(yǔ)句直接計(jì)算sin或cos函數(shù),就需要編寫(xiě)頗為復(fù)雜的程序。因?yàn)镃語(yǔ)言的語(yǔ)句中沒(méi)有提供直接計(jì)算sin或cos函數(shù)的語(yǔ)句。又如為了顯示一段文字,我們?cè)贑語(yǔ)言中也找不到顯示語(yǔ)句,只能使用庫(kù)函數(shù)printf。
C語(yǔ)言的庫(kù)函數(shù)并不是C語(yǔ)言本身的一部分,它是由編譯程序根據(jù)一般用戶的需要編制并提供用戶使用的一組程序。C的庫(kù)函數(shù)極大地方便了用戶,同時(shí)也補(bǔ)充了C語(yǔ)言本身的不足。事實(shí)上,在編寫(xiě)C語(yǔ)言程序時(shí),應(yīng)當(dāng)盡可能多地使用庫(kù)函數(shù),這樣既可以提高程序的運(yùn)行效率,又可以提高編程的質(zhì)量。
這里調(diào)用的是靜態(tài)庫(kù)。
函數(shù)庫(kù):函數(shù)庫(kù)是由系統(tǒng)建立的具有一定功能的函數(shù)的集合。庫(kù)中存放函數(shù)的名稱和對(duì)應(yīng)的目標(biāo)代碼,以及連接過(guò)程中所需的重定位信息。用戶也可以根據(jù)自己的需要建立自己的用戶函數(shù)庫(kù)。
庫(kù)函數(shù):存放在函數(shù)庫(kù)中的函數(shù)。庫(kù)函數(shù)具有明確的功能、入口調(diào)用參數(shù)和返回值。
連接程序:將編譯程序生成的目標(biāo)文件連接在一起生成一個(gè)可執(zhí)行文件。
頭文件:有時(shí)也稱為包含文件。C語(yǔ)言庫(kù)函數(shù)與用戶程序之間進(jìn)行信息通信時(shí)要使用的數(shù)據(jù)和變量,在使用某一庫(kù)函數(shù)時(shí),都要在程序中嵌入(用#include)該函數(shù)對(duì)應(yīng)的頭文件。
由于C語(yǔ)言編譯系統(tǒng)應(yīng)提供的函數(shù)庫(kù)尚無(wú)國(guó)際標(biāo)準(zhǔn)。不同版本的C語(yǔ)言具有不同的庫(kù)函數(shù),用戶使用時(shí)應(yīng)查閱有關(guān)版本的C的庫(kù)函數(shù)參考手冊(cè)。我們以Turbo C為例簡(jiǎn)介一下C的庫(kù)函數(shù),并附錄中給出了Turbo C的部分常用庫(kù)函數(shù)。
C語(yǔ)言的庫(kù)函數(shù)很多
大概幾百個(gè),舉幾個(gè)常用的
比如
printf()、scanf(),等等
庫(kù)函數(shù)是系統(tǒng)內(nèi)部定義好的,不需要定義,但在使用前
需要把它所在的函數(shù)庫(kù)的頭文件進(jìn)來(lái)
,
比如你要使用
sin()這個(gè)函數(shù)
,這個(gè)函數(shù)在math.h
這個(gè)頭文件里
,
就需要在程序開(kāi)始
加入
#include
“math.h”
然后你就可以在程序里直接使用了
最低0.27元/天開(kāi)通百度文庫(kù)會(huì)員,可在文庫(kù)查看完整內(nèi)容
原發(fā)布者:shimingtime
附錄CC語(yǔ)言常用的庫(kù)函數(shù)庫(kù)函數(shù)并不是C語(yǔ)言的一部分,它是由編譯系統(tǒng)根據(jù)一般用戶的需要編制并提供給用戶使用的一組程序。每一種C編譯系統(tǒng)都提供了一批庫(kù)函數(shù),不同的編譯系統(tǒng)所提供的庫(kù)函數(shù)的數(shù)目和函數(shù)名以及函數(shù)功能是不完全相同的。ANSIC標(biāo)準(zhǔn)提出了一批建議提供的標(biāo)準(zhǔn)庫(kù)函數(shù)。它包括了目前多數(shù)C編譯系統(tǒng)所提供的庫(kù)函數(shù),但也有一些是某些C編譯系統(tǒng)未曾實(shí)現(xiàn)的。考慮到通用性,本附錄列出ANSIC建議的常用庫(kù)函數(shù)。由于C庫(kù)函數(shù)的種類和數(shù)目很多,例如還有屏幕和圖形函數(shù)、時(shí)間日期函數(shù)、與系統(tǒng)有關(guān)的函數(shù)等,每一類函數(shù)又包括各種功能的函數(shù),限于篇幅,本附錄不能全部介紹,只從教學(xué)需要的角度列出最基本的。讀者在編寫(xiě)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ú)列出。使用這些
/***
*printf.c - print formatted
*
* Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved.
*
*Purpose:
* defines printf() - print formatted data
*
*******************************************************************************/
#include
#include
#include
#include
#include
#include
#include
/***
*int printf(format, ...) - print formatted data
*
*Purpose:
* Prints formatted data on stdout using the format string to
* format data and getting as many arguments as called for
* Uses temporary buffering to improve efficiency.
* _output does the real work here
*
*Entry:
* char *format - format string to control data format/number of arguments
* followed by list of arguments, number and type controlled by
* format string
*
*Exit:
* returns number of characters printed
*
*Exceptions:
*
*******************************************************************************/
int __cdecl printf (
const char *format,
...
)
/*
* stdout ''PRINT'', ''F''ormatted
*/
{
va_list arglist;
int buffing;
int retval;
va_start(arglist, format);
_ASSERTE(format != NULL);//斷言宏。如果輸出格式字符串指針為空,則在DEBUG版下斷言,報(bào)告錯(cuò)誤。
_lock_str2(1, stdout);
buffing = _stbuf(stdout);//stdout:指定輸出到屏幕
retval = _output(stdout,format,arglist);
_ftbuf(buffing, stdout);
_unlock_str2(1, stdout);
return(retval);
}
以上為printf()的源代碼
1、從含有可選參數(shù)函數(shù)中獲得可選參數(shù),以及操作這些參數(shù)
typedef char *va_list;
void va_start( va_list arg_ptr, prev_param );
type va_arg( va_list arg_ptr, type );
void va_end( va_list arg_ptr );
假定函數(shù)含有一個(gè)必選參數(shù)和多個(gè)可選參數(shù),必選參數(shù)聲明為普通數(shù)據(jù)類型,且能通過(guò)參數(shù)名來(lái)獲得該變量的值??蛇x參數(shù)通過(guò)宏va_start、va_arg和va_end(定義在stdarg.h或varargs.h中)來(lái)進(jìn)行操作,即通過(guò)設(shè)置指向第一個(gè)可選參數(shù)指針、返回當(dāng)前參數(shù)、在返回參數(shù)后重新設(shè)置指針來(lái)操作所有的可選參數(shù)。
va_start:為獲取可變數(shù)目參數(shù)的函數(shù)的參數(shù)提供一種便捷手段。設(shè)置arg_ptr為指向傳給函數(shù)參數(shù)列表中的第一個(gè)可選參數(shù)的指針,且該參數(shù)必須是va_list類型。prev_param是在參數(shù)列表中第一個(gè)可選參數(shù)前的必選參數(shù)。
va_arg:返回由arg_ptr所指向的參數(shù)的值,且自增指向下一個(gè)參數(shù)的地址。type為當(dāng)前參數(shù)的類型,用來(lái)計(jì)算該參數(shù)的長(zhǎng)度,確定下一個(gè)參數(shù)的起始位置。它可以在函數(shù)中應(yīng)用多次,直到得到函數(shù)的所有參數(shù)為止,但必須在宏va_start后面調(diào)用。
va_end:在獲取所有的參數(shù)后,設(shè)置指針arg_ptr為NULL。
下面舉例說(shuō)明:
#include
#include
int average( int first, ... );
void main( void )
{
/* Call with 3 integers (-1 is used as terminator). */
printf( "Average is: %d\n", average( 2, 3, 4, -1 ) );
/* Call with 4 integers. */
printf( "Average is: %d\n", average( 5, 7, 9, 11, -1 ) );
/* Call with just -1 terminator. */
printf( "Average is: %d\n", average( -1 ) );
}
int average( int first, ... )
{
int count = 0, sum = 0, i = first;
va_list marker;
va_start( marker, first ); /* Initialize variable arguments. */
while( i != -1 )
{
sum += i;
count++;
i = va_arg( marker, int);
}
va_end( marker ); /* Reset variable arguments. */
return( sum ? (sum / count) : 0 );
}
返回值為:
Average is: 3
Average is: 8
Average is: 0
綜上所述,在printf()函數(shù)中,可以只輸出一個(gè)字符串,也可按照一定的形式輸出含有多個(gè)可選參數(shù)的字符串信息。因此,首先就要通過(guò)這些宏來(lái)獲取所有的可選參數(shù)。在上面的源碼可以看出printf()中,只使用了宏at_start,將可選參數(shù)的首地址賦給了arglist。
2、鎖定字符串及輸出字符串到屏幕
#define _lock_str2(i,s) _lock_file2(i,s)
void __cdecl _lock_file2(int, void *);
#define _unlock_str2(i,s) _unlock_file2(i,s)
void __cdecl _unlock_file2(int, void *);
int __cdecl _stbuf(FILE *);
void __cdecl _ftbuf(int, FILE *);
int __cdecl _output(FILE *, const char *, va_list);
在output函數(shù)中,讀取格式字符串中的每一個(gè)字符,然后對(duì)其進(jìn)行處理,處理方式根據(jù)每一個(gè)字符所代表的意義來(lái)進(jìn)行,如:普通字符直接利用函數(shù)WRITE_CHAR(ch, charsout);輸出到控制臺(tái)。
其中的主要部分是對(duì)轉(zhuǎn)換說(shuō)明符(d,c,s,f)的處理,現(xiàn)在將對(duì)其中的部分代碼進(jìn)行詳細(xì)說(shuō)明,這里只說(shuō)明最基本的轉(zhuǎn)換說(shuō)明符,對(duì)這些須基本的轉(zhuǎn)換說(shuō)明符進(jìn)行修飾的修飾符,程序中單獨(dú)進(jìn)行處理。下面是函數(shù)output()(output.c)部分源代碼:
case ST_TYPE:
//表示當(dāng)前處理的字符的類型為轉(zhuǎn)換說(shuō)明符。
...
switch (ch) {
//下面對(duì)參數(shù)的獲取都是利用宏va_arg( va_list arg_ptr, type );來(lái)進(jìn)行的。
case ''c'': {
//從參數(shù)表中獲取單個(gè)字符,輸出到緩沖字符串中,此時(shí),type=int
buffer[0] = (char) get_int_arg(argptr); /* get char to print */
text = buffer;
textlen = 1; /* print just a single character */
}
break;
case ''s'': {
//從參數(shù)表中獲取字符串,輸出到緩沖字符串中,此時(shí),type=char*
int i;
char *p; /* temps */
text = get_ptr_arg(argptr);
...
}
break;
case ''w'': {
//對(duì)寬字符進(jìn)行處理
...
} /* case ''w'' */
break;
...
case ''e'':
case ''f'':
case ''g'': {
//對(duì)浮點(diǎn)數(shù)進(jìn)行操作
...
#if !LONGDOUBLE_IS_DOUBLE
/* do the conversion */
if (flags FL_LONGDOUBLE) {
_cldcvt((LONGDOUBLE*)argptr, text, ch, precision, capexp);
va_arg(argptr, LONGDOUBLE);
//對(duì)長(zhǎng)雙精度型進(jìn)行處理,此時(shí),type=long double
}
else
#endif /* !LONGDOUBLE_IS_DOUBLE */
{
//對(duì)雙精度型進(jìn)行處理,此時(shí),type=double
_cfltcvt((DOUBLE*)argptr, text, ch, precision, capexp);
va_arg(argptr, DOUBLE);
}
...
break;
//對(duì)整型變量處理
case ''d'':
case ''i'':
...
goto COMMON_INT;
case ''u'':
radix = 10;
goto COMMON_INT;
case ''p'':
...
goto COMMON_INT;
case ''o'':
...
注:對(duì)于浮點(diǎn)型double和long double,有相應(yīng)的轉(zhuǎn)換說(shuō)明符(%f表示雙精度型,%lf表示長(zhǎng)雙精度型),而float卻沒(méi)有。其中的原因是,在KRC下,float值用于表達(dá)式或用作參數(shù)前,會(huì)自動(dòng)轉(zhuǎn)換成double類型。而ANSI C一般不會(huì)自動(dòng)把float轉(zhuǎn)換成double。有些程序已假定其中的float參數(shù)會(huì)被轉(zhuǎn)換成double,為了保護(hù)大量這樣的程序,所有printf()函數(shù)的float參數(shù)還是被自動(dòng)轉(zhuǎn)換成double型。因此,在KRC或ANSI C下,都無(wú)需用特定的轉(zhuǎn)換說(shuō)明符來(lái)顯示float型。
綜上所述,轉(zhuǎn)換說(shuō)明符必須與待打印字符的類型。通常,用戶有種選擇。例如,如要打印一個(gè)int類型的值。則只可以使用%d,%x或%o。所有這些說(shuō)明符都表示要打印一個(gè)int類型的值;它們只不過(guò)提供了一個(gè)數(shù)值的幾種不同表示。類似一,可以用%f、%g和%e來(lái)表示double類型的值。但如果轉(zhuǎn)換說(shuō)明與類型不匹配,將會(huì)出現(xiàn)意想不到的結(jié)果。為什么呢?問(wèn)題就在于C向函數(shù)傳遞信息的方式。
這個(gè)失敗的根本細(xì)節(jié)與具體實(shí)現(xiàn)相關(guān)。它決定了系統(tǒng)中的參數(shù)以何方式傳遞。函數(shù)調(diào)用如下:
float n1;
double n2;
long n3;
long n4;
...
printf("%ld,%ld,%ld,%ld",n1,n2,n3,n4);
這個(gè)調(diào)用告訴計(jì)算機(jī),要把變量n1,n2,n3和n4的值交給計(jì)算機(jī),它把這些變量放進(jìn)稱作棧(stack)的內(nèi)存區(qū)域中,來(lái)完成這一任務(wù)。計(jì)算機(jī)把這些值放進(jìn)棧中,其根據(jù)是變量的類型而不是轉(zhuǎn)換說(shuō)明符,比如n1,把8個(gè)字節(jié)放入棧中(float被轉(zhuǎn)換成double),類似地,為n2放了8字節(jié),其后給n3和n4各放了4個(gè)字節(jié)。接著,控制的對(duì)象轉(zhuǎn)移到printf();此函數(shù)從棧中讀數(shù),不過(guò)在這一過(guò)程中,它是在轉(zhuǎn)換說(shuō)明符的指導(dǎo)下,讀取數(shù)值的。說(shuō)明符%ld指定printf()應(yīng)讀4個(gè)字節(jié)(va_arg( va_list arg_ptr, type )中type=long),因此printf()讀入棧中的4個(gè)字節(jié),作為它的第一個(gè)值。但是這只是n1的前半部分,這個(gè)值被看成一個(gè)long整數(shù)。下一個(gè)說(shuō)明符%ld讀入4個(gè)字節(jié),這正是n1的后半部分,這個(gè)值被看成第二個(gè)long整數(shù)。類似地,第三、第四次又讀入n2的前后兩部分。因此,盡管我們對(duì)n3和n4使用了正確的說(shuō)明符,printf()仍然會(huì)產(chǎn)生錯(cuò)誤。
本文名稱:c語(yǔ)言源庫(kù)函數(shù) c語(yǔ)言庫(kù)函數(shù)源代碼
路徑分享:http://jinyejixie.com/article16/doseegg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、網(wǎng)站維護(hù)、網(wǎng)站制作、定制開(kāi)發(fā)、網(wǎng)站營(yíng)銷、網(wǎng)站策劃
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)