扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
可以调用。
10年积累的成都做网站、网站制作、成都外贸网站建设经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站策划后付款的网站建设流程,更有行唐免费网站建设让你可以放心的选择与我们合作。
一、从一个源文件里调用另一个源文件的函数。在源文件A1.c中调用A2.c 中的函数有两种方法:
1、在A2.c中有完整的函数定义,在A1.c中添加一下要用到的函数原型(声明)就可以了,例如:
在A2.c中:有函数void A2(){...};。
在A1.c中:在文件前头增加一行:void A2();就可以了。
2、把A2.c中完整定义的函数的原型,写到一个A2.h文件中,然后在A1.c的文件头增加#include "A2.h"就可以了。
以上两种方法,在A1.c中都可以正常的调用,就跟在A2.c中调用一样。
其实函数默认是外部的,只要在其他文件中声明就能使用;但是注意如果在前面加上static,就只能在本文件中使用了,不能再被其他的文件调用。
二、编写头文件:
1、一个.h文件要 对应有一个.c文件,这样链接器就可以调用这个文件里的函数。比如a.h 和 a.c。
在.h文件中:
#ifndef __A_H_
#define __A_H_
#includestdio.h
void trans2(double B) ;
double trans1() ;
#endif
2、把相应的函数定义写在.c文件中。这里要强调一点:要加上#include ".h",这个一般作为一种工程规范。因为如果.c文件中的函数也需要调用同个.c中的其它函数,那么这个.
c往往会include对应的.h,这样就不需要为声明和调用顺序而发愁了。比如头文件里进行了变量的声明,这个时候对应的.c文件是一定要加上这个头文件的。
3、再在其他的main.c文件开头添加#include "a.h"。
扩展资料:
include用法:
#include命令预处理命令的一种,预处理命令可以将别的源代码内容插入到所指定的位置;可以标识出只有在特定条件下才会被编译的某一段程序代码;可以定义类似标识符功能的宏,在编译时,预处理器会用别的文本取代该宏。
插入头文件的内容
#include命令告诉预处理器将指定头文件的内容插入到预处理器命令的相应位置。有两种方式可以指定插入头文件:
1、#include文件名
2、#include"文件名"
如果需要包含标准库头文件或者实现版本所提供的头文件,应该使用第一种格式。如下例所示:
#includemath.h//一些数学函数的原型,以及相关的类型和宏
如果需要包含针对程序所开发的源文件,则应该使用第二种格式。
采用#include命令所插入的文件,通常文件扩展名是.h,文件包括函数原型、宏定义和类型定义。只要使用#include命令,这些定义就可被任何源文件使用。
#include stdio.h
int main(void)
{
char oldname[80], newname[80];
/* prompt for file to rename and new name */
printf( "File to rename: ");
gets(oldname);
printf( "New name: ");
gets(newname);
/* Rename the file */
if (rename(oldname, newname) == 0)
printf( "Renamed %s to %s.\n ", oldname, newname);
else
perror( "rename ");
return 0;
}
根据你写得要求:
一、头文件file1.h中放了一个函数申明语句。源文件中放了函数。
二、根据头文件的include语句解析字符串获取头文件名,与头文件默认路径(常量)组成文件路径。同字符串的匹配,找到在语句在源文件的位置,并读取头文件内容替换到源文件对应位置。
三、合并后的内容,我是写入新的文件中,如你想要覆盖同文件,自行修改路径常量。
#include stdio.h
#include malloc.h
#include string.h
#define NN "C:\\newFile.c"//合并后的文件完整路径
#define HPH "C:\\"//头文件的默认路径
int getFSize(char *Path);//获取文件字节数,参数文件路径
char *readHFile(char *hPath);//获取头文件内容
char *checkCFile(char *cPath,char *hcon);// 检查源文件,找到对应includ语句,替换成对应头文件内容,并保存到新的文件中
int *findStr(char *str1,char *str2);//在str1中查找str2,返回str2在str1中对应的首尾字符下标
int main()
{
char *newFile=NULL;
newFile=checkCFile("C:\\file1.c","#include\"file1.h\"");
if(newFile)
printf("合并成功,合并后的文件内容为(路径:%s):\n%s\n",NN,newFile);
else
printf("合并失败,无匹配内容\n");
free(newFile);
return 0;
}
int getFSize(char *Path)
{
int fSize=0;
if(!Path) return 0;
FILE *fp=NULL;
fp=fopen(Path,"r");
if(!fp) return 0;
fseek(fp,0,SEEK_END);
fSize=ftell(fp);
fclose(fp);
return fSize;
}
char *checkCFile(char *cPath,char *hcom)
{
int i=0,*inx=NULL,fSize=0,hfnLen=0,hPLen=0,len=0;
char *fcon=NULL,*hcon=NULL,*newfcon=NULL,*hPath=NULL,*pb=hcom,*pe=pb,*hfn=NULL;
if(!cPath || !hcom) return NULL;
FILE *fp=NULL;
fp=fopen(cPath,"rb+");//这里不要要用r,避免下面计算大小误差
if(!fp) return 0;
if(!(fSize=getFSize(cPath))) return NULL;
printf("源文件大小:%d字节\n",fSize);
fcon=(char *)malloc(sizeof(char)*(fSize+1));
if(!fcon) return 0;
fcon[fSize]=0;
//fseek(fp,0,SEEK_SET);
if(fread(fcon,1,fSize,fp)!=fSize) return NULL;
printf("源文件内容为:\n%s\n",fcon);
if(!(inx=findStr(fcon,hcom))) return NULL;//将找到的匹配内容所在下标保存在inx指向地址
fclose(fp);
//----通过include语句获取头文件文件名---
while(*pb!='"')pb++;
pb++,pe=pb;
while(*pe!='"')pe++;
hfnLen=pe-pb;
hfn=(char *)malloc(sizeof(char)*(hfnLen+1));
if(!hfn)return NULL;
hfn[hfnLen]=0;
while(pbpe)hfn[i++]=*pb,pb++;
//----------------------------------------
hPLen=hfnLen+strlen(HPH);
hPath=(char *)malloc(sizeof(char)*(hPLen+1));
strcpy(hPath,HPH);
strcat(hPath,hfn);
hPath[hPLen]=0;
hcon=readHFile(hPath);//获得头文件对应内容
//----合并两个文件内容到新的数组,释放原数组---
len=fSize-strlen(hcom)+strlen(hcon);
newfcon=(char *)malloc(sizeof(char)*(len+1));
if(!newfcon) return NULL;
newfcon[0]=0;
fcon[inx[0]]=0;
pb=fcon;
strcpy(newfcon,pb);
pb=hcon;
strcat(newfcon,pb);
pb=fcon[inx[1]+1];
strcat(newfcon,pb);
newfcon[len]=0;
free(fcon);
free(hcon);
free(hfn);
//----------------------------------------------
//-------------写入新文件-----------------------
fp=fopen(NN,"w");
if(!fp) return NULL;
fwrite(newfcon,1,strlen(newfcon),fp);
fclose(fp);
//---------------------------------------------
return newfcon;
}
char *readHFile(char *hPath)
{
int fSize=0;
char *hcon=NULL;
FILE *fp=NULL;
fp=fopen(hPath,"rb+");
if(!fp)return NULL;
if(!(fSize=getFSize(hPath)))return NULL;
printf("头文件大小:%d字节\n",fSize);
hcon=(char *)malloc(sizeof(char)*(fSize+1));
if(!hcon) return NULL;
hcon[fSize]=0;
if(fread(hcon,1,fSize,fp)!=fSize) return NULL;
printf("头文件内容为:\n%s\n",hcon);
fclose(fp);
return hcon;
}
int *findStr(char *str1,char *str2)
{
char *p0=NULL,*p1=NULL;
int i,cnt=0,len1,len2;
static int inx[2];//str2首尾字符在str1中的对应下标
if(!str1 || !str2) return NULL;
inx[0]=inx[1]=0;
len1=strlen(str1);
len2=strlen(str2);
for(i=0;ilen1;i++)
{
cnt=0,p0=str1[i],p1=p0+len2-1;
//每次搜索,先用p0,p1定位str2的在str1中的首尾位置,进行字符对比,再两指针向内收缩比较
if(*p0!=str2[cnt] || *p1!=str2[len2-1-cnt]) continue;
cnt++,p0++,p1--;
while(p0=p1)
{
if(*p0!=str2[cnt] || *p1!=str2[len2-1-cnt]) break;//只要一对字符不匹配,跳过本次对比
cnt++,p0++,p1--;
}
if(p0p1)//没有跳过说明本次完全匹配,记录首尾位置
{
inx[0]=i,inx[1]=i+len2-1;
return inx;
}
}
return NULL;
}
1、C语言中没有提供字符串替换函数,网上能找到的类似函数也只是能替换一个,不能替换全部,工作中却常常要用到这个功能,故实现一个函数。该函数所使用到的相关函数均是自己实现,没有调用库函数。
2、函数代码如下:
/*descript:replace str,返回一个替换以后的字符串,用完之后要free()
success:return 1
error:return 0
BUG:"select * from tab where id=':a' and name =':aa'",this is not support,this function is just simple str_replace ,not support all SQL language
*/
char *replacestr(char *strbuf, char *sstr, char *dstr)
{ char *p,*p1;
int len;
if ((strbuf == NULL)||(sstr == NULL)||(dstr == NULL))
return NULL;
p = strstr(strbuf, sstr); //返回字符串第一次出现的地址,否则返回NULL
if (p == NULL) /*not found*/
return NULL;
len = strlen(strbuf) + strlen(dstr) - strlen(sstr);
p1 = malloc(len);
bzero(p1, len);
strncpy(p1, strbuf, p-strbuf);
strcat(p1, dstr);
p += strlen(sstr);
strcat(p1, p);
return p1;
}
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流