c语言文本编辑器

--------------------2019/1/2声明一下:这个已经过去一年了 我不记得了。。。我 有生之年 有空会重新写的。就是这样。姐姐忙着新课设呢。。。。

10天课程设计写了这个垃圾代码, 有需要同学可以看看。

2018.12.19 上设计模式听到命令模式:更新一下:撤销真的是 用栈啊,现在可以结束理解了,大概有空会修改下

   我采用了链表和顺序表,然后算法就是字符串匹配BF,还有顺序表查找,删除,但是均有修改,比如BF算法修改成可以记录重复出现位置还可以返回位置,顺序表查找删除是可以以字符串为单位进行插入删除,,,呃呃呃,我只是在前人基础上小小修改了一下。本来还想写撤销功能,因为时间还有各种因素就暂时搁置,我总是会写完,这个有bug,体现在插入,对于汉字还有尾部插入,我没有处理好。。。修改修改就可以了。因为时间原因就不想写了,还有这次收获也会说出来、

 

#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()//进栈出栈,,,,,,,哇、

 

 

 

 

Get:

1.
 如果gets()没有起作用 
解决:
这个函数之前还有用scanf()函数读取变量的操作,如果是,那么就是由于这个scanf()在缓冲区中遗留了一个输入数据时按的"回车键",这个gets()会将这个字符取走,不会再等待从键盘输入.
解决方法:
可以在这个gets()函数的前一行加入一句fflush(stdin);刷新输入缓冲区.
2.
sizeof(指针)=4
sizeof和strlen的区别 
❀第一个例子: 
char* ss = "0123456789"; 
1、sizeof(ss)的结果是4,ss是指向字符串常量的字符指针 
2、sizeof(*ss)的结果是1,*ss是第一个字符 


❀第二个例子: 
char ss[] = "01233456789"; 
1、sizeof(ss)结果是11,ss是数组,计算到'\0'的位置,因此是10+1 
2、sizeof(*ss)结果是1,*ss是第一个字符 


❀第三个例子 
char ss[100] = "0123456789"; 
1、sizeof(ss)的结果是100,ss表示在内存中预分配的大小:100*1 
2、strlen(ss)的结果是10,它的内部实现是用一个循环计算字符串的长度,直到'\0'为止。 


❀第四个例子 
int ss[100] = "0123456789"; 
1、sizeof(ss)的结果是400,ss表示在内存中的大小,为100*4 
2、strlen(ss)错误,strlen的参数只能是char*,且必须是以'\0'结尾的。 
注:笔者试验时无法对ss初始化 
3.
字节和位是不同。。。。一个字节=8位。 int long 4字节,32位,(不同机器不一样,)
5.指针作为函数参数,,,,,返回多值
6 撤销操作与栈
撤销就是返回到上一步,栈内元素取出来,然后栈顶元素就是上一个,但是要判断栈顶元素为空不?
7memset 对于字符串初始化比较有用,对于整型数组,赋值只能为0 -1,还要看大小,没有什么用的东西、

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值