main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define MaxSize 80
typedef struct
{
char data[MaxSize];
int length;
} SqString;
void ShowMenu();
void OpenFile(FILE *[]);
int MakeChoice(int );
void FormatCurlyBrace(FILE *[]);
void GetNext(SqString,int *);
int KMPIndex(SqString,SqString );
void Judge_main(FILE *[]);
void AddNote(FILE *[]);
int main()
{
FILE *fp[2];//定义成文件指针数组是为了方便传递文件指针
OpenFile(fp);
while(1)
{
system("cls");
ShowMenu();
switch(MakeChoice(4))
{
case 1:
system("cls");
Judge_main(fp);
break;
case 2:
system("cls");
FormatCurlyBrace(fp);
break;
case 3:
system("cls");
AddNote(fp);
break;
default:
fclose(fp[1]);
fclose(fp[2]);
exit(0);
}
}
return 0;
}
function.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define MaxSize 80
typedef struct
{
char data[MaxSize];
int length;
} SqString;
void ShowMenu()
{
printf("1.判断是否只有一个main()函数;\n");
printf("2.使花括号独占一行;\n");
printf("3.将m至n行的代码作为注释;\n");
printf("4.退出\n");
}
void OpenFile(FILE *fp[])
{
char path1[80],path2[80];
printf("请输入源文件路径:\n");
scanf("%s",path1);
fp[1]=fopen(path1,"r");
while(fp[1]==NULL)
{
printf("打开失败,请重新输入源文件路径:\n");
scanf("%s",path1);
fp[1]=fopen(path1,"r");
}
printf("成功载入源文件!\n");
printf("请输入目标文件路径:\n");
scanf("%s",path2);
fp[2]=fopen(path2,"a");
while(fp[2]==NULL)
{
printf("打开失败,请重新输入目标文件路径:\n");
scanf("%s",path2);
fp[2]=fopen(path2,"a");
}
printf("成功载入目标文件!\n");
printf("按任意键继续");
getch();
}
int MakeChoice(int n)
{
int judge;
printf("请输入1~%d\n",n);
scanf("%d",&judge);
while(judge<1||judge>n)//确保输入的是1~n
{
printf("输入不合法,请输入1~%d\n",n);
fflush(stdin);//如果不加这句,输入一些字母会导致函数无限循环
scanf("%d",&judge);
}
return judge;
}
void GetNext(SqString t,int next[])
{
int j,k;
j=0;
k=-1;
next[0]=-1;
while(j<t.length-1)
{
if(k==-1||t.data[j]==t.data[k])
{
++j;
++k;
next[j]=k;
}
else
k=next[k];
}
}
int KMPIndex(SqString s,SqString t)
{
int next[MaxSize],i=0,j=0;
GetNext(t,next);
while(i<s.length&&j<t.length&&s.data[i]!='\0')//判断至'\0'结束
{
if(j==-1||s.data[i]==t.data[j])
{
++i;
++j;
}
else
j=next[j];
}
if(j>=t.length)
return(i-t.length);
else
return(-1);
}
void Judge_main(FILE *fp[])
{
int main_counter=0;
SqString line,sub;
line.length=80;
strcpy(sub.data,"main()");
sub.length=strlen(sub.data);
rewind(fp[1]);
while(!feof(fp[1]))
{
fgets(line.data,80,fp[1]);
if(KMPIndex(line,sub)>=0)
++main_counter;
}
if(main_counter==1)
printf("只有一个main()函数\n\n");
else if(main_counter==0)
printf("没有main()函数!\n\n");
else
printf("有%d个main()函数!\n\n",main_counter);
printf("按任意键继续");
getch();
}
void FormatCurlyBrace(FILE *fp[])
{
char s1,s2,num=1;
s1='\0';//s1初始化,因为需要s2读入第一个字符,且需要s1的判断
rewind(fp[1]);
rewind(fp[2]);
fprintf(fp[2],"1 ");
while(!feof(fp[1]))
{
fscanf(fp[1],"%c",&s2);
if((s2=='{'||s2=='}')&&s1!='\n'&&s1!=' ')//当前字符为花括号,且前一个字符不为换行或空格
{
fputc('\n',fp[2]);
fprintf(fp[2],"%d ",++num);
}
else if((s1=='{'||s1=='}')&&s2!='\n'&&s2!=' ')//前一个字符不为换行或空格,且当前字符为花括号
{
fputc('\n',fp[2]);
fprintf(fp[2],"%d ",++num);
}
if(s1=='\n')//前一个字符为换行,即之后的输出应该在下一行
fprintf(fp[2],"%d ",++num);
fputc(s2,fp[2]);
s1=s2;
}
printf("操作成功!\n");
printf("按任意键继续");
getch();
}
void AddNote(FILE *fp[])
{
int m,n,num=1,count=0;
SqString line;
line.length=80;
printf("请输入起止的行数:\n");
scanf("%d%d",&m,&n);
fflush(stdin);
while(m<=0||n<=0||m>n)
{
printf("输入不合法,请重新输入\n");
fflush(stdin);
scanf("%d%d",&m,&n);
}
rewind(fp[1]);
rewind(fp[2]);
while(!feof(fp[1]))
{
fgets(line.data,80,fp[1]);
fprintf(fp[2],"%d",num);
if(num>=m&&num<=n)
{
fprintf(fp[2],"//");
++count;
}
fputs(line.data,fp[2]);
++num;
}
if(count==0)
printf("操作失败!可能是起始行数大于代码总行数。\n");
else if(count<n-m)
printf("终止行数大于总行数,已将起始行数至末尾全部改为注释\n");
else
printf("操作成功!\n");
printf("按任意键继续");
getch();
}