1. 程式人生 > >c語言文字編輯器

c語言文字編輯器

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdint.h>
#include<ctype.h>
# define LEN sizeof(struct Lnode)
typedef struct list
{
    char data[80];//80字元為1行,1行一個節點
    int line[80];//列
    int row;//行
    struct Lnode *next;


} list,*linklist;


typedef struct stack
{
    int data;
    struct stack* next;
} stack,*linkstack;


linkstack push(linkstack s,int data1);
linkstack pop(linkstack s,int data1);
int search(char *s,char *t,int x[10]);
void replace(char *s,char *t,char *t1);//在字串s裡找到字串t,然後用t0替換t;
int judege(char *s);
void BF(char *s,char *t);
void delete(linklist L,char* ch);
void insert1(linklist L,int row,int line,char *ch);
void insert(int x,char *s,char *t);
void insert0(int x,char *s,char *t);//在字串s的x位置插入t 


void print(linklist L)//80字元為1行,1行一個節點
{
    int len,i=0;
    while(L)
    {
        printf("第%d行:",L->row);
        while(i<strlen(L->data))
        {
            printf("%c",L->data[i]);
            i++;
        }
        printf("\n");
        L=L->next;
        i=0;
    }
}


linklist create()
{
    int i=0,j,line,t;
    char express[80]="\0";
    linklist head,r,p;
    head=(linklist)malloc(sizeof(list));
    head->next=NULL;
    printf("(輸入quit退出)\n");
  // memset(head->data,'\0',80);//沒有什麼用
  //strcpy(head->data,"\0");
    fflush(stdin);
    head->row=i;
    printf("第%d行:",head->row);
    gets(express);
    strcpy(head->data,express);
    //t=judege(express);
    for(line=0; line<strlen(express); line++)
    {
        head->line[line]=line;
    }
    r=head;




    while(1)
    {
        i++;
        p=(linklist)malloc(sizeof(list));//為新節點開闢空間
        //strcpy(p->data,"\0" );
        //memset(p->data,'\0',80);
        printf("第%d行:",i);
        gets(express);
        for(line=0; line<strlen(express); line++)
        {
            p->line[line]=line;
        }
        strcpy(p->data,express);
        p->row=i;
        if(strcmp(express,"quit")==0) break;
        p->next=NULL;
        r->next=p;
        r=p;


    }
    return head;
}
/*int judege(char *s)
{
    int len=0,i=0,len1=0;
    while(i<strlen(s))
    {
        if(s[i]>127)
        {
            len++;
        }
        else
        {
            len1++;
        }
        i++;
    }
    return len/2+len1;


}*/
void count(linklist L)
{
    int Chinese=0;
    int lowcase=0;
    int capital=0;
    int punction=0;
    int space=0;
    int i=0,num=0;
    while(L)
    {
        while(i<strlen(L->data))
        {
            if(isdigit(L->data[i]))//isdigit
            {
                num++;
            }
            else if(isupper(L->data[i]))
            {
                capital++;
            }
            else if(islower(L->data[i]))
            {
                lowcase++;
            }
            else if(ispunct(L->data[i]))
            {
                punction++;
            }
            else if(L->data[i]==32)
            {
                space++;
            }
            else if((uint8_t)L->data[i]>127)//
            {
                Chinese++;
            }
            i++;
        }
        L=L->next;
        i=0;


    }
    printf("漢字個數為: %d\n",Chinese/2);
    printf("數字個數為: %d\n",num);
    printf("空格個數為: %d\n",space);
    printf("標點符號個數為: %d\n",punction);
    printf("小寫字母個數為: %d\n",lowcase);
    printf("大寫字母個數為: %d\n",capital);


}


int main()
{
    int n1[10];
    int c,c1,end,line1,row1,m=0,m1=0,n=0;
    char ch[80],ch1[80],x[80],x1[80],x2[80];


    linklist L,L1,position,L2,L3,L4,L5;
    L1=NULL;
    printf("               \t\t      ----------->\n");
    printf("\t\t \t     |文字編輯器|     \t\n");
    printf("             \t\t    <-----------\n");
    printf(" \t \t   \t       1.開始  \t\n");
    printf(" \t \t   \t       2.退出  \t\n");
    printf("請選擇功能:\n");
    while(  scanf("%d",&c)==1)
    {
        printf("\t\t|**************功能選單**************|\n");
        printf("\t\t \t       0.退出\n");
        printf("\t\t \t       1.寫文字\n");
        printf("\t\t \t       2.文字內容統計\n");
        printf("\t\t \t       3.文字內容查詢\n");
        printf("\t\t \t       4.文字內容刪除\n");
        printf("\t\t \t       5.文字內容插入\n");
        //printf("\t\t \t       6.撤銷內容\n");
        printf("\t\t \t       6.替換內容\n");
        printf("\t\t|*************************************|\n");
        printf("請選擇:\n");
        while(scanf("%d",&c1)!=0)
        {
            switch(c1)
            {
            case 0:
                return 0;
                break;
            case 1:
                printf("請輸入文件");
                L1= create();
                printf("輸出:\n");
                print(L1);
                break;
            case 2:
                count(L1);
                break;
            case 3:
                printf("請輸入想查詢的字元或者字串:");
                scanf("%s",ch);
                L2=L1;
                int count=0;
                while(L2)
                {
                    n=search(L2->data,ch,n1);
                    if(n>0)
                    {
                        int i;
                        for(i=0; i<n; i++)
                        {
                            printf("出現在%d行,在%d列\n",L2->row,n1[i]);
                        }
                    }
                    count=count+n;
                    L2=L2->next;
                }
                if(count==0) printf("查無此資訊\n");
                else
                {
                    printf("共出現%d次",count);
                }
                break;
            case 4:
                printf("請輸入想刪除的字元或者字串:");
                scanf("%s",ch1);
                print(L1);
                delete(L1,ch1);
                break;
            case 5:
                printf("請輸入想插入的字元或者字串:");
                scanf("%s",x);
                printf("請輸入想插入的行數和列數: ");
                scanf("%d %d",&row1,&line1);
                m=0;
                L3=L1;
                while(L3)
                {
                    while(m<=strlen(L3->data))
                    {
                        if((L3->line[m]==line1)&&(L3->row==row1))
                        {
                            insert(L3->line[m],L3->data,x);
                            break;
                        }
                        m++;
                    }
                    L3=L3->next;
                    m=0;
                }
                break;
            //case 6:
            //    printf("確定撤銷?\n");//撤銷:上一步
            //    break;
            case 6:
                printf("請輸入查詢的內容\n");//刪除插入
                scanf("%s",x1);
                L4=L1;
                L5=L1;
                int n0=0;
                int count1=0;
                while(L4)
                {
                    n0=search(L4->data,x1,n1);
                    count1=count1+n0;
                    L4=L4->next;
                }
                if(count==0) printf("查無此資訊\n");
                else
                {
                    printf("共出現%d次",count1);
                    printf("請輸入替換內容\n");
                    scanf("%s",x2);
                    while(L5)
                    {
                        replace(L5->data,x1,x2);
                        L5=L5->next;
                    }
                    printf("替換後:\n");
                    print(L1);
                }
                break;
            }
        }
    }
}
void BF(char *s,char *t)
{
    int i=0,j=0,t1,t2;
    int slen=strlen(s);
    int tlen=strlen(t);
    while(i<slen)
    {
        if(s[i]==t[j])
        {
            i++;
            j++;
            if(j==tlen)
            {
                for(t1=0; t1<tlen; t1++)
                {
                    for(t2=(i-tlen)+1; t2<=slen-1; t2++)
                    {
                        s[t2-1]=s[t2];
                    }
                }
                s[slen-tlen]='\0';
                slen=strlen(s);
                i=0;
                j=0;
            }
        }
        else
        {
            i=i-j+1;
            j=0;
        }
    }
}
void replace(char *s,char *t,char *t1)//在s位置用t1來替換t
{
    int i,j=0,m=0,n=0;
    int x[10];
    j=search(s,t,x);
    BF(s,t);
    m=strlen(t);
    n=strlen(t1);
    for(i=0; i<j; i++)
    {
        if(i==0)
        {
            insert0(x[i],s,t1);
        }
        else
        {
            insert0(x[i]+n-m,s,t1);
        }
    }
}
void insert(int x,char *s,char *t)//在字串s的x位置插入t 
{
    int i,j,m;
    i=strlen(s);
    printf("插入前:%s\n",s);
    for(m=0; m<strlen(t); m++)
    {
        for(j=i; j>=x-1; j--)
            s[j+1]=s[j];
        s[x++]=t[m];
        ++i;
    }
    printf("插入後:%s",s);
}
void insert0(int x,char *s,char *t)//在字串s的x位置插入t 
{
    int i,j,m;
    i=strlen(s);
   // printf("插入前:%s\n",s);
    for(m=0; m<strlen(t); m++)
    {
        for(j=i; j>=x-1; j--)
            s[j+1]=s[j];
        s[x++]=t[m];
        ++i;
    }
   // printf("插入後:%s",s);
}




void delete(linklist L,char* ch)
{
    int m1=0;
    int m2=2;
    int m3=3;
    while(L)
    {
        BF(L->data,ch);
        printf("第%d行:%s\n",L->row,L->data);
        L=L->next;
    }
}
int search(char *s,char *t,int x[10])//BF演算法。
{
    int i=0,j=0,t1,t2,num=0;
    //int *t0;
   // int temp;
  //  int a[10];
    int slen=strlen(s);
    int tlen=strlen(t);
    while(i<slen)
    {
        if(s[i]==t[j])
        {
            i++;
            j++;
            if(j==tlen)
            {
                printf("%s在%s 的%d位置\n",t,s,i-tlen);
                x[num]=i-tlen;
                num++;
            }
        }
        else
        {
            i=i-j+1;
            j=0;
        }
    }
    return num;
}
linkstack push(linkstack s,int data1)
{
    linkstack p;
    p=(linkstack)malloc(sizeof(stack));
    p->data=data1;
    p->next=s;
    s=p;
    return s;
}
linkstack pop(linkstack s,int data1)
{
    linkstack p;
    if(s==NULL) return NULL;


    data1=s->data;
    p=s;
    s=s->next;
    free(p);
    return s;


}
int gettop(linkstack s,int data1)
{
    if(s!=NULL)
        return s->data;
}


//void cancel()//進棧出棧,,,,,,,哇、