c語言拓展函數(shù)庫 c語言庫函數(shù)實現(xiàn)

C語言與C語言庫函數(shù)是什么關(guān)系

1、C語言與C語言庫函數(shù)的關(guān)系就類似于漢字與經(jīng)典著作的關(guān)系。

公司主營業(yè)務:做網(wǎng)站、成都網(wǎng)站制作、移動網(wǎng)站開發(fā)等業(yè)務。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出淳安免費做網(wǎng)站回饋大家。

C語言是一種計算機編程語言,C語言函數(shù)庫是由C語言編寫出來的文獻。方便后來者們更加簡單快捷的使用C語言。

2、C語言是一種程序設(shè)計的入門語言。由于C語言的語句中沒有提供直接計算sin或cos函數(shù)的語句,會造成編寫程序困難;但是函數(shù)庫提供了sin和cos函數(shù),可以拿來直接調(diào)用。顯示一段文字,我們在C語言中找不到顯示語句,只能使用庫函數(shù)printf。

C語言的庫函數(shù)并不是C語言本身的一部分,它是由編譯程序根據(jù)一般用戶的需要,編制并提供用戶使用的一組程序。C的庫函數(shù)極大地方便了用戶,同時也補充了C語言本身的不足。在編寫C語言程序時,使用庫函數(shù),既可以提高程序的運行效率,又可以提高編程的質(zhì)量。

如何在我的C語言程序中插入庫函數(shù)

int add(int x,int y);

int sub(int x,int y);

int mul(int x,int y);

int div(int x,int y);

#include math.h

#include stdio.h

void main()

{

int a,b,c,d,e,f,g,h,i;

printf("XXXXXXXXXXXXXXX計算器");

printf("\n");

for(c=1;c=30;c++)

printf("*");

printf("\n");

printf("請輸入一個整數(shù)");

printf("\n");

scanf("%d",a);

printf("\n");

for(c=1;c=30;c++)

printf("-");

printf("\n");

printf("請選擇您要做的運算:1.+,2.-,3.*,4./5.abs,6.sqrt");

printf("\n");

for(c=1;c=30;c++)

printf("*");

printf("\n");

scanf("%d",d);

printf("\n");

if(d==5) {printf("%d",abs(a));goto end;}(如果想做絕對值,就直接做abs函數(shù)(它是個庫函數(shù)).做完后就goto"end"--也就是函數(shù)的最后.)

if(d==6) {printf("%.2f",sqrt(a));goto end;};}(如果想做開平方,就直接做sqrt函數(shù)(它是個庫函數(shù)).做完后就goto"end"--也就是函數(shù)的最后.)

printf("請再次輸入一個整數(shù)"); (如果是做雙目的就開始輸入第二個數(shù)b)

printf("\n");

scanf("%d",b);

printf("\n");

switch(d)

{

case 1:add(a,b);break;

case 2:sub(a,b);break;

case 3:mul(a,b);break;

case 4:div(a,b);break;

default:printf("date input error!\n");

} end: printf("\n");}

int add(int x,int y)

{

int m;

m=x+y;

printf("%d",m);

return m;

}

int sub(int x,int y)

{

int m;

m=x-y;

printf("%d",m);

return m;

}

int mul(int x,int y)

{

int m;

m=x*y;

printf("%d",m);

return m;

}

int div(int x,int y)

{

int m;

m=x/y;

printf("%d",m);

return m;

}

(你試試看吧!應該可以!呵呵)

C語言和擴展C語言是什么關(guān)系

嚴格的來說,沒有擴展C語言。C語言就是指符合C89,C99,C11標準的語言。在此基礎(chǔ)上引入更多的功能可以稱為拓展函數(shù)庫。

此外,還有很多類似于C的語言,例如object-C,它并屬于擴展C語言,是一種以C語言為基礎(chǔ)設(shè)計的新語言。object-c通常寫作objective-c或者obj-c或OC,是根據(jù)C語言所衍生出來的語言,繼承了C語言的特性,是擴充C的面向?qū)ο缶幊陶Z言。它主要使用于Mac OS X和GNUstep這兩個使用OpenStep標準的系統(tǒng),而在NeXTSTEP和OpenStep中它更是基本語言。Objective-C可以在gcc運作的系統(tǒng)寫和編譯,因為gcc含Objective-C的編譯器。在MAC OS X系統(tǒng)下,運用蘋果提供的SDK等開發(fā)工具包,可以用來做IOS開發(fā),開發(fā)后的程序在Iphone虛擬機中進行測試,運用的主要語言為Object-c。

C語言庫函數(shù)如何編寫?

/***

*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版下斷言,報告錯誤。

_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ù)含有一個必選參數(shù)和多個可選參數(shù),必選參數(shù)聲明為普通數(shù)據(jù)類型,且能通過參數(shù)名來獲得該變量的值??蛇x參數(shù)通過宏va_start、va_arg和va_end(定義在stdarg.h或varargs.h中)來進行操作,即通過設(shè)置指向第一個可選參數(shù)指針、返回當前參數(shù)、在返回參數(shù)后重新設(shè)置指針來操作所有的可選參數(shù)。

va_start:為獲取可變數(shù)目參數(shù)的函數(shù)的參數(shù)提供一種便捷手段。設(shè)置arg_ptr為指向傳給函數(shù)參數(shù)列表中的第一個可選參數(shù)的指針,且該參數(shù)必須是va_list類型。prev_param是在參數(shù)列表中第一個可選參數(shù)前的必選參數(shù)。

va_arg:返回由arg_ptr所指向的參數(shù)的值,且自增指向下一個參數(shù)的地址。type為當前參數(shù)的類型,用來計算該參數(shù)的長度,確定下一個參數(shù)的起始位置。它可以在函數(shù)中應用多次,直到得到函數(shù)的所有參數(shù)為止,但必須在宏va_start后面調(diào)用。

va_end:在獲取所有的參數(shù)后,設(shè)置指針arg_ptr為NULL。

下面舉例說明:

#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ù)中,可以只輸出一個字符串,也可按照一定的形式輸出含有多個可選參數(shù)的字符串信息。因此,首先就要通過這些宏來獲取所有的可選參數(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ù)中,讀取格式字符串中的每一個字符,然后對其進行處理,處理方式根據(jù)每一個字符所代表的意義來進行,如:普通字符直接利用函數(shù)WRITE_CHAR(ch, charsout);輸出到控制臺。

其中的主要部分是對轉(zhuǎn)換說明符(d,c,s,f)的處理,現(xiàn)在將對其中的部分代碼進行詳細說明,這里只說明最基本的轉(zhuǎn)換說明符,對這些須基本的轉(zhuǎn)換說明符進行修飾的修飾符,程序中單獨進行處理。下面是函數(shù)output()(output.c)部分源代碼:

case ST_TYPE:

//表示當前處理的字符的類型為轉(zhuǎn)換說明符。

...

switch (ch) {

//下面對參數(shù)的獲取都是利用宏va_arg( va_list arg_ptr, type );來進行的。

case ''c'': {

//從參數(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ù)表中獲取字符串,輸出到緩沖字符串中,此時,type=char*

int i;

char *p; /* temps */

text = get_ptr_arg(argptr);

...

}

break;

case ''w'': {

//對寬字符進行處理

...

} /* case ''w'' */

break;

...

case ''e'':

case ''f'':

case ''g'': {

//對浮點數(shù)進行操作

...

#if !LONGDOUBLE_IS_DOUBLE

/* do the conversion */

if (flags FL_LONGDOUBLE) {

_cldcvt((LONGDOUBLE*)argptr, text, ch, precision, capexp);

va_arg(argptr, LONGDOUBLE);

//對長雙精度型進行處理,此時,type=long double

}

else

#endif /* !LONGDOUBLE_IS_DOUBLE */

{

//對雙精度型進行處理,此時,type=double

_cfltcvt((DOUBLE*)argptr, text, ch, precision, capexp);

va_arg(argptr, DOUBLE);

}

...

break;

//對整型變量處理

case ''d'':

case ''i'':

...

goto COMMON_INT;

case ''u'':

radix = 10;

goto COMMON_INT;

case ''p'':

...

goto COMMON_INT;

case ''o'':

...

注:對于浮點型double和long double,有相應的轉(zhuǎn)換說明符(%f表示雙精度型,%lf表示長雙精度型),而float卻沒有。其中的原因是,在KRC下,float值用于表達式或用作參數(shù)前,會自動轉(zhuǎn)換成double類型。而ANSI C一般不會自動把float轉(zhuǎn)換成double。有些程序已假定其中的float參數(shù)會被轉(zhuǎn)換成double,為了保護大量這樣的程序,所有printf()函數(shù)的float參數(shù)還是被自動轉(zhuǎn)換成double型。因此,在KRC或ANSI C下,都無需用特定的轉(zhuǎn)換說明符來顯示float型。

綜上所述,轉(zhuǎn)換說明符必須與待打印字符的類型。通常,用戶有種選擇。例如,如要打印一個int類型的值。則只可以使用%d,%x或%o。所有這些說明符都表示要打印一個int類型的值;它們只不過提供了一個數(shù)值的幾種不同表示。類似一,可以用%f、%g和%e來表示double類型的值。但如果轉(zhuǎn)換說明與類型不匹配,將會出現(xiàn)意想不到的結(jié)果。為什么呢?問題就在于C向函數(shù)傳遞信息的方式。

這個失敗的根本細節(jié)與具體實現(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);

這個調(diào)用告訴計算機,要把變量n1,n2,n3和n4的值交給計算機,它把這些變量放進稱作棧(stack)的內(nèi)存區(qū)域中,來完成這一任務。計算機把這些值放進棧中,其根據(jù)是變量的類型而不是轉(zhuǎn)換說明符,比如n1,把8個字節(jié)放入棧中(float被轉(zhuǎn)換成double),類似地,為n2放了8字節(jié),其后給n3和n4各放了4個字節(jié)。接著,控制的對象轉(zhuǎn)移到printf();此函數(shù)從棧中讀數(shù),不過在這一過程中,它是在轉(zhuǎn)換說明符的指導下,讀取數(shù)值的。說明符%ld指定printf()應讀4個字節(jié)(va_arg( va_list arg_ptr, type )中type=long),因此printf()讀入棧中的4個字節(jié),作為它的第一個值。但是這只是n1的前半部分,這個值被看成一個long整數(shù)。下一個說明符%ld讀入4個字節(jié),這正是n1的后半部分,這個值被看成第二個long整數(shù)。類似地,第三、第四次又讀入n2的前后兩部分。因此,盡管我們對n3和n4使用了正確的說明符,printf()仍然會產(chǎn)生錯誤。

C語言怎樣建立自己的函數(shù)庫?

可以,只要實現(xiàn)文件也加到工程里面就可以了.

注意,工程要包含你的頭文件和實現(xiàn)文件,這樣你自己的函數(shù)庫就可以在任何需要的工程中使用了.

可以,只要的程序調(diào)用的時候能找到函數(shù)的定義就可以了.所謂定義就是函數(shù)的具體實現(xiàn)程序.

C語言 庫函數(shù)

C語言的庫函數(shù)很多

大概幾百個,舉幾個常用的

比如

printf()、scanf(),等等

庫函數(shù)是系統(tǒng)內(nèi)部定義好的,不需要定義,但在使用前

需要把它所在的函數(shù)庫的頭文件進來

,

比如你要使用

sin()這個函數(shù)

,這個函數(shù)在math.h

這個頭文件里

,

就需要在程序開始

加入

#include

“math.h”

然后你就可以在程序里直接使用了

當前文章:c語言拓展函數(shù)庫 c語言庫函數(shù)實現(xiàn)
本文URL:http://muchs.cn/article20/hjdjjo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、定制開發(fā)自適應網(wǎng)站、微信小程序App設(shè)計、外貿(mào)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司