C语言综合实践7.18

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();
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值