#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void judgemain (); /*判断主函数*/
int is_sub_sring(char *s1,char *s2); /*判断s1是否包含在读入的一行s2中*/
void meihua(); /*大括号单独占一行,加行号*/
void add_notes(); /*添加注释*/
void print(); /*输出代码文件中的内容(加行数)*/
int i;
FILE *fp;
char ch;
char filename[100]; /*要打开的文件名*/
char filename0[100]; /*修改后要存储的文件名*/
int main()
{
while (1)
{
printf("选择你要进行的操作:\n");
printf("1.检查主函数\n");
printf("2.使”{}“独占一行\n");
printf("3.将特定行设为注释\n");
printf("0.退出\n");
scanf("%d",&i);
if (i>0&&i<=3)
{
printf("输入你要打开修改的代码文件名:\n");
scanf("%s",filename);
if (i==1)
judgemain();
if (i==2)
meihua();
if (i==3)
add_notes();
}
else
break;
}
return 0;
}
void judgemain()
{
fp=fopen(filename,"r");
if (!fp)
{
fprintf(stderr,"error open file!\n"); /* 输出错误信息到标准错误设备 */
exit(-1);
}
int main=0; /*main函数的个数*/
char s1[10000],s2[10000]; /*存储输入的主函数和读入的代码内容*/
printf("输入要检查的主函数:\n"); /*输入要检查的主函数内容*/
scanf("%s",s1);
while (fscanf(fp,"%s",s2)!=EOF)
{
main+=is_sub_sring(s1,s2);
}
printf("主函数有%d个\n",main);
if (main>1)
printf("!!!你的代码有%d个主函数!!!\n",main);
if (main==0)
printf("!!!你的代码没有主函数!!!\n");
fclose(fp);
}
int is_sub_sring(char *s1,char *s2) /*判断s1是否在s2中并返回有几个*/
{
int len1,len2,i,t,s0,main=0,flag;
len1=strlen(s1); /*s1的长度*/
len2=strlen(s2); /*读入s2的长度*/
for (i=0;i<len2;i++) /*进行len2次循环找出s2中有几个s1*/
{
if (s1[0]==s2[i]) /*如果查找到一个字符和s1的第一个字符相同继续比较后面的字符*/
{
for (t=i,s0=0;t<i+len1,s0<len1;t++,s0++)
{
if (s1[s0]==s2[t])
flag=1;
else
{
flag=0;
break;
}
}
if (flag==1) /*如果返回值为1则s2中有s1,s1个数+1*/
{
i=i+len1;
main++;
flag=0; /*flag初始化*/
}
}
}
return main; /*返回s1的个数*/
}
void meihua()
{
char next,last;
last='\0';
fp=fopen(filename,"r");
if (!fp)
{
fprintf(stderr,"error open file!\n"); /* 输出错误信息到标准错误设备 */
exit(-1);
}
FILE *fout;
printf("请输入修改后另存为的文件名:");
scanf("%s",filename0);/*输入修改后要存为的文件名*/
fout=fopen(filename0,"w");
while (fscanf(fp,"%c",&ch)!=EOF)/*逐个字符扫描*/
{
if (ch=='{'||ch=='}')/*如果遇到{}执换行操作*/
{
if (last!='\n')/*如果前一个字符不是换行符加换行符*/
fprintf(fout,"\n%c",ch);
else
{
fscanf(fp,"%c",&next);/*读入{}的下一个字符*/
if (next=='\n')/*判断{}的下一个字符是否为换行符*/
fprintf(fout,"%c%c",ch,next);/*如果{}的下一个字符为换行符向文件中直接写入ch和next字符*/
else
fprintf(fout,"%c\n%c",ch,next);/*如果{}的下一个字符不是换行符则加上换行符后写入*/
}
}
else
fprintf(fout,"%c",ch);
last=ch;
}
fclose(fout);
fout=fopen(filename0,"r");
print(fout);
printf("修改后的文件已经另存为“%s”\n",filename0);
fclose(fout);
fclose(fp);
}
void add_notes()
{
FILE *fout;
fp=fopen(filename,"r");
printf("请输入修改后另存为的文件名:");
scanf("%s",filename0);
fout=fopen(filename0,"w");
int m,n,hang=1;
printf("这是原程序\n");
print(fp);
fclose(fp);
fp=fopen(filename,"r");
printf("请输入要作为注释的开始行:\n");
scanf("%d",&m);
printf("输入从开始行开始的行数:\n");
scanf("%d",&n);
while (fscanf(fp,"%c",&ch)!=EOF)
{
if (ch=='\n') /*计算行数*/
{
hang++;
}
if (hang>=m&&ch=='\n'&&hang<=m+n-1) /*如果行数在输入的数据之间加上//*/
{
fprintf(fout,"%c//",ch);
}
else
fprintf(fout,"%c",ch);
}
fclose(fout);
fclose(fp);
fout=fopen(filename0,"r");
printf("这是修改后的程序\n");
print(fout);
fclose(fout);
}
void print(FILE *file) /*打印代码文件中的内容并加上行号*/
{
int hang=1;
printf("%d|",hang);
while (fscanf(file,"%c",&ch)!=EOF)
{
if (ch=='\n')
{
hang++;
printf("%c%d|",ch,hang);
}
else
printf("%c",ch);
}
printf("\n");
hang=1;
}