1. 程式人生 > >綜合實踐報告(7)C程式原始碼操作(內附五套程式碼)

綜合實踐報告(7)C程式原始碼操作(內附五套程式碼)

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
char str[9999];      //  str 刪除多餘空格後的
int cint[25],cmain[25],cmi=0; // int欄位的記錄,main()欄位的統計,int main()相匹配的欄位
char s[99][99],a[999][99];// s輸入的原始資料 ,a按空格臨時儲存的資料
string strl[99];          //string 型別依空格為界儲存資料
int Findint(string a[],int n)  //找出 所有的 int ,返回找到了k個
{
    int i,k=0;
    string strint="int";
    for(i=0; i<n; i++)
    {
        if(a[i]==strint)
            cint[k++]=i;
    }
    return k;
}
int Findmain(string a[],int n) //找出 所有的 main() {,返回找到了幾個
{
    int i,k=0;
    string aa="main()",b="main(",c=")",d="main",e="(";
    for(i=0; i<n; i++)
    {
        if(a[i]==aa||(a[i]==b&&a[i+1]==c)||(a[i]==d&&a[i+1]==e&&a[i+2]==c))
            cmain[k++]=i;              //所有可能的 main後括號的情況
    }
    return k;
}
int main()
{
    int i=0;
    while(gets(s[i++])){}
    int j=0,m,n=i-1,k=0,p=0,q;  //n記錄原始輸入多少行程式碼
    for(i=0; i<n; i++)      //把輸入程式碼 儲存在一行程式碼裡
    {
        for(k=0; k<strlen(s[i]); k++)
            str[j++]=s[i][k];
        str[j++]=' ';
    }
    j=0;
    k=0;
    for(i=0; i<strlen(str); i++) //把長串 按空格轉化成j個string型別臨時儲存
    {
        if(str[i]!=' ')
            a[j][k++]=str[i];
        if(str[i]==' ')
        {
            strl[j]=string(a[j]);
            j++;
            k=0;
            if(str[i+1]==' ')
                j--;
        }
    }
    m=j;                     //記錄 string型別的一共有m個
    p=Findint(strl,m);
    q=Findmain(strl,m);
    for(i=0; i<q; i++)     //匹配是否有合適的 int main()返回
    {                       //  即int 和main 序列 是差一的
        for(j=0; j<p; j++)
        {
            if(cint[j]==(cmain[i]-1))
                cmi++;
        }
    }
    if(cmi==1)
        cout<<"有一個main函式"<<endl;
    else if(cmi==0)
        cout<<"暫時沒發現main"<<endl;
    else if(cmi>1)
        cout<<"有不止一個main函式"<<endl;
    cout<<endl<<endl<<"格式化括號:"<<endl<<endl;
    FILE *fp;
    fp=fopen("1.c","w"); //開啟檔案1.c
    int d=0;
    for(i=0;i<n;i++)
    {
       cout<<d+1<<". ";
       for(j=0;j<strlen(s[i]);j++)
       {
           if((s[i][j]=='{'||s[i][j]=='}')&&j!=0)
            {                //未單獨成行的花括號讓其單獨成行
                d++;                 //分別在螢幕,檔案顯示
                fprintf(fp,"\n");
                cout<<endl<<d+1<<". ";
            }
           cout<<s[i][j];
           fprintf(fp,"%c",s[i][j]);
       }
       d++;
       fprintf(fp,"\n");
        cout<<endl;
    }
    fclose(fp);   //關閉上個操作的檔案指標
    fp=fopen("2.c","w");
    int sta,en;   //註釋起的起始行 sta en
    cout<<endl<<"請輸入要註釋起的行 開始+結束"<<endl;
    cin>>sta>>en;
    d=0;
    for(i=0;i<n;i++)
    {
        d++;
        cout<<d<<". ";
        if(d>=sta&&d<=en)   //符合在區間之內的
            {
                cout<<"//";
                fprintf(fp,"//");
            }
        puts(s[i]);
        fputs(s[i],fp);
        fprintf(fp,"\n");
    }
    fclose(fp);
}
C主要程式碼(未用KMP匹配,普通匹配)
#include <string.h>
#include <stdio.h>
char str[9999];      //  str 刪除多餘空格後的
int cmain; // 查詢到的main的個數
char s[99][99];// s[i]輸入的原始資料
void findmain()  //查詢函式中共出現了幾次main()
{
    cmain=0;
    char s[7]= {"main()"};
    int j;
    for(int i=0; i<strlen(str); i++)
    {
        if(str[i]=='m')
        {
            for(j=1; j<6; j++)
            {
                i++;
                if(str[i]!=s[j])
                {
                    i=i+j+1;
                    break;
                }
            }
            if(j==6)
                cmain++;
        }
    }
}
int main()
{
    int i=0;
    while(gets(s[i++])) {}   //分行輸入
    int j=0,m,n=i-1,k=0,p=0,q;
    for(i=0; i<n; i++)      //把輸入程式碼 儲存在一行程式碼裡
    {
        for(k=0; k<strlen(s[i]); k++)
            str[j++]=s[i][k];
        str[j++]=' ';
    }
    findmain();
    if(cmain==0)
        printf("暫時沒發現main函式\n");
    else if(cmain==1)
        printf("有一個main函式\n");
    else
        printf("不只有一個main函式\n\n");
    printf("###格式化花括號操作###\n\n");
    FILE *fp;
    fp=fopen("7.1.c","w"); //開啟檔案1.c
    int d=0;
    for(i=0; i<n; i++)
    {
        printf("%d. ",d+1);
        for(j=0; j<strlen(s[i]); j++)
        {
            if((s[i][j]=='{'||s[i][j]=='}')&&j!=0)
            {
                d++;
                fprintf(fp,"\n");
                printf("\n%d. ",d+1);
            }
            printf("%c",s[i][j]);
            fprintf(fp,"%c",s[i][j]);
        }
        d++;
        fprintf(fp,"\n");
        printf("\n");
    }
    fclose(fp);   //關閉上個操作的檔案指標
    printf("###批量註釋操作###\n\n");
    fp=fopen("7.2.c","w");
    int sta,en;   //註釋起的起始行 sta en
    printf("請輸入要註釋起的行 開始+結束\n\n");
    scanf("%d%d",&sta,&en);
    d=0;
    for(i=0; i<n; i++)
    {
        d++;
        printf("%d. ",d);
        if(d>=sta&&d<=en)
        {
            printf("//");
            fprintf(fp,"//");
        }
        puts(s[i]);
        fputs(s[i],fp);
        fprintf(fp,"\n");
    }
    fclose(fp);
}
C++程式碼 string型別find的應用