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||''==log->path[0])return;

memset(&stat_buf,0,sizeof(structstat));

fstat(log->fd,&stat_buf);

if(stat_buf.st_size>log->size)

{

close(log->fd);

if(log->num)

snprintf(new_path,128,"%s%d",log->path,(int)time(NULL));

else

{

snprintf(bak_path,128,"%s.bak",log->path);

snprintf(new_path,128,"%s.new",log->path);

remove(bak_path);//deletethefile*.bakfirst

rename(new_path,bak_path);//changethenameofthefile*.newto*.bak

}

//createanewfile

log->fd=open(new_path,O_RDWR|O_APPEND|O_CREAT|O_SYNC,S_IRUSR|S_IWUSR|S_IROTH);

}

}


⑧ 关于C语言中封装函数的问题

回删是这回事:
\b是退格键,退格加输入,就是回删了。
例如:
cout << "Enter three characters:___\b\b\b";
char ch[4];//最多输入三个字符,多版了权就越界了
cin>>ch;
cout<<ch<<endl;
//......
自己在编译器里试一试就知道了。

⑨ c语言中要封装一个函数( 比如什么printf之类的),肯定得用.c和.h文件,函数声明在.h文件中.函数实现在c文

//mvector.h--声明
#ifndefMVECTOR_H_
#defineMVECTOR_H_
typedefstruct_mvect
{
intx;
inty;
}vect;
voidgetvect(vect*v);//声明
voidshowvect(vectv);//声明
#endif
//mvector.c--实现
#include"mvector.h"
#include<stdio.h>
voidgetvect(vect*v)
{
scanf("%d,%d",&(v->x),&(v->y));
}
voidshowvect(vectv)
{
printf("%d,%d",v.x,v.y);
}
//main.c--使用
#include"mvector.h"
#include<stdio.h>
intmain()
{
vecta;
getvect(&a);
showvect(a);
}

注意mvector.h必须位于当前文件夹下,且必须把mvector.c和main.c放在一个工程里内编译。

输入容:2,3

输出:2,3

⑩ 如何封装C语言程序

文件夹debug里的exe文件就是直接可以运行的