文本编辑器代码分析

来源:互联网 发布:阿里云国际版网址 编辑:程序博客网 时间:2024/04/30 13:18

一、采用栈结构的行编辑器

1、功能分析

   a. 输入不是"#"也不是"@"时,压入栈中

   b.是"#",则栈顶元素出栈

   c.是"@",则栈前的数据清空

   d.接受到'\n'回车键或者EOF(Ctrl+z)键时,则结束

typedef struct SqStack{//栈定义    SElemType *base;      SElemType *top;      int stacksize;      DestoryStack(SqStack &S);     ClearStack(SqStack &S);  }SqStack;

结果演示:


        当输入字符时,getchar()能够自动接受,输入中,//EOF为全文结束符的while循环最后,ch=getchar();保证了持续输入字符;

最后输入完毕后,ctrl+z结束大循环。

         输入中,将数据压入栈S中,遇到'#'时,出栈一个数据,遇到'@',出栈所有数据,这样S中就是处理后的数据。

         最后将栈S中的数据从最后拷贝进栈S1最开始,S1出栈的数据就是从S的首字符开始的。

2、总结

      主要是行编辑,采用固定长(这里初始为100)的一段栈空间,来编辑一行。

二、文本编辑器课程设计2分析

1、数据结构及交互性分析

typedef struct line{char text[81];int num;struct line *next;struct line *prior;}txtLine;txtLine *start;txtLine *last;

输入数据时,开始是从linenum=1开始

int enter(int linenum){txtLine *info;for (;;){   info=(txtLine *)malloc(sizeof(txtLine));   if (!info)   {    printf("\t!内存不足!\n");    return(NULL);   }   printf("%d:",linenum);   gets(info->text);//获得字符串数据,enter键时,不接受'\n',并且在最后一个字节自动添加上'\0'   info->num=linenum;   if (*info->text)   {    if (find(linenum))//查询改行是否存在    {     patchup(linenum,1);//将后面的行结构中的所在行依次+1    }    if (*info->text)    {     start=insert_Line(info);//插入改数据,刚好通过头文本start指针和尾文本last指针的num行值,来找到断裂的num行,在插入数据    }   }   else   {    break;   }   linenum++;}

查找字符串,用strstr()库函数来查询返回字符串的指针,然后它会根据行所在的指针,逐个字符遍历计算字符串所在的位置i

void wordfind()//查找定位单词{txtLine *p;char keyword[80];printf("请输入你要查找的单词:");gets(keyword);char *key=keyword,*q,*r;int len=strlen(key),i;p=start;do{q=p->text;q--;do{i=1;if(q=strstr(++q,key))//在字符串q中寻找字符串key,如果找到返回首字符指针{r=q;//判断是否是单词if(!(((*(r-1)>='a'&&*(r-1)<='z')||(*(r-1)>='A'&&*(r-1)<='Z'))&&((*(r+len)>='a'&&*(r+len)<='z')||(*(r+len)>='A'&&*(r+len)<='Z')))){for(r=p->text;r!=q;r++)if(!((*r>='a'&&*r<='z')||(*r>='A'&&*r<='Z')))i++;printf("你查找的单词在第%d行第%d个\n",p->num,i);printf("继续下一个查找输入'y'回车将停止查找:");


保存文件时,通过循环输入

info=start;while(info){   p=info->text;   while(*p)\\最后一个字符为'\0',系统自动添加的   {    putc(*p++,fp);   }   putc('\n',fp);\\写入'\n'作为标志,以便后面读取   info=info->next;\\下一个文本指针}

装载文件时,释放txtLine结构大小的内存,作为开始链头,

info=start;p=info->text;inct=1;while ((*p=getc(fp))!=EOF){   p++;   while ((*p=getc(fp))!='\n')\\通过'\n'标志   {    p++;   }   //getc(fp);   //丢掉'\n'   *p='\0';\\将文本最后一个字符置为0   info->num=inct++;   info->next=(txtLine *)malloc(size);\\再释放第二个文本链,后面继续,只是未显示   if (!info->next)   {    printf("\n\t内存已经用完!");    return;   }

2、结论

      主要是将固定行文本以链表的形式来管理,gets()获得字符串时,对于enter键,则自动会在后面加'\0',而不接受'\n'。

       另外使用strstr()来匹配字符串,在保存文件时,碰到'\0'会写入'\n'字符,作为读取的标志,当读到的字符getc(fp)是'\n',则写文本内存数据为'\0'。

 

参考:1、栈结构之行编辑程序

2、getchar()问题

3、c语言中的EOF

4、文本编辑器课程设计2

5、C编程制作简单文本编辑

6、简单的文本编辑器设计报告