c語(yǔ)言函數(shù)可以自己編寫(xiě) c語(yǔ)言函數(shù)可以自己編寫(xiě)嗎

C語(yǔ)言編寫(xiě)函數(shù)?

在C語(yǔ)言中,一個(gè)標(biāo)準(zhǔn)的函數(shù)定義語(yǔ)句塊必須包含函數(shù)返回值的類(lèi)型標(biāo)識(shí)符、函數(shù)名、形參類(lèi)型及數(shù)量、函數(shù)體、返回值表達(dá)式。如果函數(shù)返回值類(lèi)型為 void (即無(wú)返回值),則在兩個(gè)大括號(hào)之間不能寫(xiě)帶有返回值表達(dá)式的 return 語(yǔ)句,否則編譯器就會(huì)報(bào)錯(cuò)。你寫(xiě)的 test 函數(shù)返回值類(lèi)型為 void,而你在函數(shù)定義語(yǔ)句塊內(nèi)寫(xiě)下了 return 語(yǔ)句,編譯器自然會(huì)報(bào)錯(cuò)了。

創(chuàng)新互聯(lián)公司于2013年創(chuàng)立,先為通城等服務(wù)建站,通城等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢(xún)服務(wù)。為通城企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。

你可以將這個(gè)函數(shù)修改為以下形式:

int test(int n)

{

int m = n / 2;

return m;

}

c語(yǔ)言如何編寫(xiě)自己的函數(shù)

int

getdata(int

a,int

b)//括號(hào)是形式參數(shù),前面int

是函數(shù)返回值類(lèi)型

{

...

return

a;//返回值

}

...是實(shí)現(xiàn)的代碼。

自己看看書(shū)上的函數(shù)定義和實(shí)現(xiàn)形式很容易的。

怎么在c語(yǔ)言中自己寫(xiě)庫(kù)函數(shù)

1、不同的系統(tǒng)開(kāi)發(fā)函數(shù)庫(kù)的具體步驟是不一樣的,這主要決定于編譯、鏈接環(huán)境。

2、不同的庫(kù)開(kāi)發(fā)方式也不一樣,現(xiàn)在主流的庫(kù)開(kāi)發(fā)有兩種,一種是靜態(tài)庫(kù),一種是動(dòng)態(tài)庫(kù),兩者的本質(zhì)區(qū)別是庫(kù)代碼是否和程序融合在一起,如果組裝在一起就是靜態(tài)庫(kù),如果不組裝在一起,即為動(dòng)態(tài)庫(kù),現(xiàn)在操作系統(tǒng)提供的多數(shù)是動(dòng)態(tài)庫(kù),如Linux平臺(tái)的.so文件,windows平臺(tái)的DLL文件。

3、以Windows平臺(tái)為例,用戶(hù)可以通過(guò)Vc/vs等IDE集成開(kāi)發(fā)環(huán)境,生成DLL工程,然后編寫(xiě)def文件進(jìn)行導(dǎo)出。

用C語(yǔ)言編寫(xiě)自定義函數(shù):

(1)素?cái)?shù)判斷函數(shù):是返回1,否則返回0

int?prime(int?n){

int?i;

if(n2??!(n1)?||?n2)

return?0;

for(i=3;i*i=n;i+=2)

if(!(n%i))

return?0;

return?1;

}

(2)編寫(xiě)排序函數(shù)(冒泡排序、選擇排序)

void?bubbling(int?*p,int?n){//冒泡

int?i,j,k;

for(i=0;in;i++)

for(j=1;jn;j++)

if(p[j]p[j-1])

k=p[j],p[j]=p[j-1],p[j-1]=k;

}

void?select(int?*p,int?n){//選擇

int?i,j,k;

for(n--,i=0;in;i++){

for(k=i,j=k+1;j=n;j++)

if(p[k]p[j])

k=j;

if(k-i)

j=p[k],p[k]=p[i],p[i]=j;

}

}

(3)查找函數(shù),找到返回下標(biāo),否則返回-1

int?find(int?*p,int?n,int?x){//順序

int?i;

for(i=0;in;i++)

if(p[i]==x)

return?i;

return?-1;

}

int?fihalf(int?*p,int?n,int?x){//折半,升序?yàn)槔?/p>

int?l,r,m;

l=0,r=n-1;

while(m=(l+r)1,lr??p[m]-x)

p[m]x???l=m+1?:?r=m-1;

return?p[m]==x???m?:?-1;

}

(4)插入函數(shù),升序?yàn)槔?/p>

C語(yǔ)言庫(kù)函數(shù)如何編寫(xiě)?

/***

*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ù)類(lèi)型,且能通過(guò)參數(shù)名來(lái)獲得該變量的值。可選參數(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類(lèi)型。prev_param是在參數(shù)列表中第一個(gè)可選參數(shù)前的必選參數(shù)。

va_arg:返回由arg_ptr所指向的參數(shù)的值,且自增指向下一個(gè)參數(shù)的地址。type為當(dāng)前參數(shù)的類(lèi)型,用來(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)前處理的字符的類(lèi)型為轉(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類(lèi)型。而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ō)明符必須與待打印字符的類(lèi)型。通常,用戶(hù)有種選擇。例如,如要打印一個(gè)int類(lèi)型的值。則只可以使用%d,%x或%o。所有這些說(shuō)明符都表示要打印一個(gè)int類(lèi)型的值;它們只不過(guò)提供了一個(gè)數(shù)值的幾種不同表示。類(lèi)似一,可以用%f、%g和%e來(lái)表示double類(lèi)型的值。但如果轉(zhuǎn)換說(shuō)明與類(lèi)型不匹配,將會(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)稱(chēng)作棧(stack)的內(nèi)存區(qū)域中,來(lái)完成這一任務(wù)。計(jì)算機(jī)把這些值放進(jìn)棧中,其根據(jù)是變量的類(lèi)型而不是轉(zhuǎn)換說(shuō)明符,比如n1,把8個(gè)字節(jié)放入棧中(float被轉(zhuǎn)換成double),類(lèi)似地,為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ù)。類(lèi)似地,第三、第四次又讀入n2的前后兩部分。因此,盡管我們對(duì)n3和n4使用了正確的說(shuō)明符,printf()仍然會(huì)產(chǎn)生錯(cuò)誤。

用c語(yǔ)言編寫(xiě)一個(gè)自定義的函數(shù)時(shí)的基本步驟

1 根據(jù)功能,想一個(gè)函數(shù)名,并設(shè)計(jì)好返回值類(lèi)型以及參數(shù)列表。參數(shù)列表包括參數(shù)個(gè)數(shù),每個(gè)參數(shù)類(lèi)型,以及該參數(shù)的作用。

2 根據(jù)函數(shù)要實(shí)現(xiàn)的功能,實(shí)現(xiàn)函數(shù)的主體代碼。

3 按照你設(shè)計(jì)的想法,傳入不同參數(shù)類(lèi)型,驗(yàn)證函數(shù)功能并調(diào)試。

當(dāng)前文章:c語(yǔ)言函數(shù)可以自己編寫(xiě) c語(yǔ)言函數(shù)可以自己編寫(xiě)嗎
本文鏈接:http://www.muchs.cn/article2/dooddoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、做網(wǎng)站網(wǎng)站收錄、靜態(tài)網(wǎng)站、網(wǎng)站策劃、小程序開(kāi)發(fā)

廣告

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

網(wǎng)站優(yōu)化排名