c語言函數的封裝
① c語言如何封裝一個帶有可變參數的方法
需要借用C語言的VA_LIST宏定義,及相關操作來實現可變參數。
VA_LIST所在頭文件:#include <stdarg.h>,用法如下:
(1)首先在函數里定義一具VA_LIST型的變數,這個變數是指向參數的指針;
(2)然後用VA_START宏初始化剛定義的VA_LIST變數;
(3)然後用VA_ARG返回可變的參數,VA_ARG的第二個參數是你要返回的參數的類型(如果函數有多個可變參數的,依次調用VA_ARG獲取各個參數);
(4)最後用VA_END宏結束可變參數的獲取。
以下是一個自定義列印介面的實現:
intmy_printf(constchar*fmt,...)//...表示參數可變
{
va_listargs;//定義va_list
staticchargc_PrintfOutBuff[1000];
va_start(args,fmt);//初始化
vsnprintf((char*)gc_PrintfOutBuff,1000,(char*)fmt,args);//這里沒有使用VA_ARG取回單個變數,而是借用vsnprinf一次性讀取。
va_end(args);//結束獲取
puts("%s",(constchar*)gc_PrintfOutBuff);//使用。
return0;
}
② C語言函數封裝要輸出一個二維數組 怎麼封裝及引用
#include<stdio.h>
int output(int *p,int n,int m)//指針,1維數,2維數。
{
int i;
int j;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
printf("%5d",*(p+m*i+j));
}
printf("\n");
}
return 0;
}
int main()
{
int a[2][3]={{4,5,6},{1,2,3}};
output(&a[0][0],2,3); //將第一個元素的地址傳遞。
getchar();
return 0;
}
③ 怎樣將多個C函數封裝起來
int fun() //若是其中有調用失敗的返回為0標識一下
{
function1();
function2();
……
functionn();
return 1;
}
④ C語言中如何將自己常用的函數封裝到編譯器的庫函數中具體應該怎麼做呢
編寫好的代碼放入到一個頭文件裡面,比如放入到 #include "myhead.h" ,然後將這個頭文件放入你編譯器的一個文件夾叫做 :include 文件夾裡面,include 文件夾就是你編譯器自動去尋找頭文件的地方了,比如 #include <stdio.h>就是在裡面的,你把你的頭文件放入到裡面去就行了,下次調用的話就不用 #include "myhead.h",而可以直接像調用系統的頭文件一樣,#include <myhead.h>
⑤ c語言中可封裝指啥
結構體,利用在每個函數中傳一個結構體,結構體定義為全部變數,可以實現C版得繼承和封裝,但不能實現多態;
⑥ C語言 把以下函數封裝成自己寫的函數和介面 strlen atoi strcpy strcat s
樓上智商拙計啊
int
my_strlen(char
*buf)
{
int
count
=
0;
for(;
*buf
!=
'\0';
*buf
++)
{
count
++;
}
return
count;
}
剩下的繼續追問吧,一次上傳不完
⑦ C語言怎麼封裝自己寫的函數
用C語言的時候,您是否還在使用printf函數來輸出日誌呢?您是否考慮過將printf函數列印的內容存到文件中去呢?您是否想擁有一個可選擇的既支持輸出到屏幕又支持存儲到文件中的日誌函數呢?很高興的告訴您,如果您願意的話,歡迎使用本人編寫的一個一套日誌函數,該套函數由五部分組成,分別是宏變數BUF_SIZE、結構體log_st、log_init函數、log_debug函數和log_checksize函數。其中宏變數BUF_SIZE用來限制每次輸出的日誌的最大長度;結構體用來存儲用戶需求,包括文件路徑、文件描述符號、單個文件最大大小、輸出方式標志、文件命名標志等;log_init函數用來完成用戶需求錄入、文件創建等功能,在mian函數的開始調用一次即可;log_debug函數的功能跟printf很類似,是在printf基礎上進行的擴充,實現將日誌輸出到屏幕或者寫入到文件,在需要列印日誌的地方調用該函數;log_checksize函數用來檢測日誌文件大小是否超過最大大小限制,它需要您定時或者定點調用它,如果一直不調用,則日誌文件將不受指定的最大大小限制。
一、定義宏變數BUF_SIZE
view plain to clipboardprint?
#defineBUF_SIZE1024
二、定義log_st結構體
view plain to clipboardprint?
typedefstruct_log_stlog_st;
struct_log_st
{
charpath[128];
intfd;
intsize;
intlevel;
intnum;
};
三、定義log_init函數
參數說明:path——您要存儲的文件路徑;size——單個文件的最大大小,如果超過該大小則新建新的文件用來存儲;level——日誌輸出方式,建議在上層限制其值的范圍為0到3,0表示日誌既不輸出到屏幕也不創建文件和保存到文件,1表示日誌保存到文件但不輸出到屏幕,2表示日誌既輸出到屏幕也保存到文件,3表示日誌只輸出到文件而不創建文件和存入文件;num——日誌文件命名方式,非0表示以(int)time(NULL)作為文件名來保存文件,文件數量隨著日誌量的遞增而遞增;0表示以「.new」和「.bak」為文件名來保存文件,文件數量不超過兩個,隨著日誌量的遞增,舊的日誌文件將被新的覆蓋,更直觀的說就是說.new」和「.bak」文件只保存最近的日誌。
view plain to clipboardprint?
log_st*log_init(char*path,intsize,intlevel,intnum)
{
charnew_path[128]={0};
if(NULL==path||0==level)returnNULL;
log_st*log=(log_st*)malloc(sizeof(log_st));
memset(log,0,sizeof(log_st));
if(level!=3)
{
//thenumusetocontrolfilenaming
log->num=num;
if(num)
snprintf(new_path,128,"%s%d",path,(int)time(NULL));
else
snprintf(new_path,128,"%s.new",path);
if(-1==(log->fd=open(new_path,O_RDWR|O_APPEND|O_CREAT|O_SYNC,S_IRUSR|S_IWUSR|S_IROTH)))
{
free(log);
log=NULL;
returnNULL;
}
}
strncpy(log->path,path,128);
log->size=(size>0?size:0);
log->level=(level>0?level:0);
returnlog;
}
四、定義log_debug函數
view plain to clipboardprint?
voidlog_debug(log_st*log,constchar*msg,...)
{
va_listap;
time_tnow;
char*pos;
char_n=' ';
charmessage[BUF_SIZE]={0};
intnMessageLen=0;
intsz;
if(NULL==log||0==log->level)return;
now=time(NULL);
pos=ctime(&now);
sz=strlen(pos);
pos[sz-1]=']';
snprintf(message,BUF_SIZE,"[%s",pos);
for(pos=message;*pos;pos++);
sz=pos-message;
va_start(ap,msg);
nMessageLen=vsnprintf(pos,BUF_SIZE-sz,msg,ap);
va_end(ap);
if(nMessageLen<=0)return;
if(3==log->level)
{
printf("%s ",message);
return;
}
if(2==log->level)
printf("%s ",message);
write(log->fd,message,strlen(message));
write(log->fd,&_n,1);
fsync(log->fd);
}
五、定義log_checksize函數
view plain to clipboardprint?
voidlog_checksize(log_st*log)
{
structstatstat_buf;
charnew_path[128]={0};
charbak_path[128]={0};
if(NULL==log||3==log->level||'