网站建设资讯

NEWS

网站建设资讯

c语言函数封装数组 c语言 封装

C语言函数封装要输出一个二维数组 怎么封装及引用

#includestdio.h

创新互联建站服务项目包括阳信网站建设、阳信网站制作、阳信网页制作以及阳信网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,阳信网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到阳信省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

int output(int *p,int n,int m)//指针,1维数,2维数。

{

int i;

int j;

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

{

for(j=0;jm;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语言里数组做封装函数的几个问题

1,你函数作用就是要返回数组中的最大值,你返回0那还玩什么,相当于做完考试题目你不写答案。

2,你把printf函数放到循环里了吧,每次循环都要走一遍printf,就有几个输出。

3,你想要的时候。。。。

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 plaincopy to clipboardprint?

#define BUF_SIZE 1024

二、定义log_st结构体

view plaincopy to clipboardprint?

typedef struct _log_st log_st;

struct _log_st

{

char path[128];

int fd;

int size;

int level;

int num;

};

三、定义log_init函数

参数说明:path——您要存储的文件路径;size——单个文件的最大大小,如果超过该大小则新建新的文件用来存储;level——日志输出方式,建议在上层限制其值的范围为0到3,0表示日志既不输出到屏幕也不创建文件和保存到文件,1表示日志保存到文件但不输出到屏幕,2表示日志既输出到屏幕也保存到文件,3表示日志只输出到文件而不创建文件和存入文件;num——日志文件命名方式,非0表示以(int)time(NULL)作为文件名来保存文件,文件数量随着日志量的递增而递增;0表示以“.new”和“.bak”为文件名来保存文件,文件数量不超过两个,随着日志量的递增,旧的日志文件将被新的覆盖,更直观的说就是说.new”和“.bak”文件只保存最近的日志。

view plaincopy to clipboardprint?

log_st *log_init(char *path, int size, int level, int num)

{

char new_path[128] = {0};

if (NULL == path || 0 == level) return NULL;

log_st *log = (log_st *)malloc(sizeof(log_st));

memset(log, 0, sizeof(log_st));

if (level != 3)

{

//the num use to control file naming

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;

return NULL;

}

}

strncpy(log-path, path, 128);

log-size = (size  0 ? size:0);

log-level = (level  0 ? level:0);

return log;

}

四、定义log_debug函数

view plaincopy to clipboardprint?

void log_debug(log_st *log, const char *msg, ...)

{

va_list ap;

time_t now;

char *pos;

char _n = '\n';

char message[BUF_SIZE] = {0};

int nMessageLen = 0;

int sz;

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\n", message);

return;

}

if (2 == log-level)

printf("%s\n", message);

write(log-fd, message, strlen(message));

write(log-fd, _n, 1);

fsync(log-fd);

}

五、定义log_checksize函数

view plaincopy to clipboardprint?

void log_checksize(log_st *log)

{

struct stat stat_buf;

char new_path[128] = {0};

char bak_path[128] = {0};

if(NULL == log || 3 == log-level || '\0' == log-path[0]) return;

memset(stat_buf, 0, sizeof(struct stat));

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); //delete the file *.bak first

rename(new_path, bak_path); //change the name of the file *.new to *.bak

}

//create a new file

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

}

}

c语言中能不能定义函数数组

函数不可以定义为数组,可以用函数指针来操作。

1.函数指针的数组定义方法:返回值类型( * 指针变量名[Number]) (形参列表)。

例如:

double add(double a,double b){}

double sub(double a,double b){}

double mul(double a,double b){}

double div1(double a,double b){}

double (*oper_func[])(double, double) = {add,sub,mul,div1};//函数指针的数组定义。

2.函数指针是指向函数的指针变量。 因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。

C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数。

扩展资料:

指针函数和函数指针的区别:

这两个概念都是简称,指针函数是指返回值是指针的函数,即本质是一个函数。我们知道函数都有返回类型(如果不返回值,则为无值型),只不过指针函数返回类型是某一类型的指针。其定义格式如下所示:返回类型标识符*函数名称。

返回类型可以是任何基本类型和复合类型。返回指针的函数的用途十分广泛。事实上,每一个函数,即使它不带有返回某种类型的指针,它本身都有一个入口地址,该地址相当于一个指针。比如函数返回一个整型值,实际上也相当于返回一个指针变量的值,不过这时的变量是函数本身而已,而整个函数相当于一个“变量”。

参考资料:百度百科 - 函数指针


当前标题:c语言函数封装数组 c语言 封装
URL网址:http://cdweb.net/article/dosesji.html