1、源文件后缀默认是.cpp的,不要改成.c
2、源文闷闷件路径自己设在d盘及之后。vc默认安装即可,不需要改目录
这样蚂前弯也许能避免很多你暂时理解不了的悔碰问题
根据你写得要求:
一、头文件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(pb<pe)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=0i<len1i++)
{
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(p0>p1)//没有跳过说明本次完全匹配,记录首尾位置
{
inx[0]=i,inx[1]=i+len2-1
return inx
}
}
return NULL
}
以下是一个简单的C语言程序,用于输出给定的图案:
这个程序非常简单。它包括一个main函数,该函数使用printf函数来输出指定的图案。printf函数是缓掘C语言中用于输出文本的函数。
在上面的程序中,我们调用printf函数并将所需的文本作为参数传递。要输出多个字符串,只需在每个字符串之间添加适当的空格或其他分隔符即可。在本例中,我们将所有字符串组合成一个大字符串,并在结尾处添加一个换行符\n以使输出具有更好的可读性。
要运行这个程序,请按照以下步骤 *** 作:
打开一个文本编辑器,例如记事本或Sublime Text。
复制上面的程序并将其粘贴到文本编辑器中。
保存文件并将其命名为任何您喜欢的名称,只需确保文件扩展名为.c。
打开命樱哪伏令提示符或终端窗口。
使用cd命令将当前目录更改为程序所在的目录。
输入gcc yourfile.c -o yourprogram命令编译程序,将yourfile.c替换为你保存的C语言程序文件名,并将yourprogram替换为你要生成的可执行文件名。这个脊携命令将编译程序并生成一个可执行文件。
在命令提示符或终端窗口中输入./yourprogram命令运行程序,将yourprogram替换为你生成的可执行文件名。
程序将输出所需的图案。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)