文本编辑器代码分析
来源:互联网 发布:阿里云国际版网址 编辑:程序博客网 时间: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、简单的文本编辑器设计报告
- 文本编辑器代码分析
- 文本编辑器代码分析(续1)
- 文本编辑器代码分析(续2)
- 【文本】简易文本编辑器分析
- 文本编辑器的代码
- OSX文本编辑器代码
- 简易文本编辑器分析
- 多种 网页文本编辑器 分析
- 去除文本中的html代码 编辑器适用
- 文本编辑器html代码<变成& lt;解决
- csdn测试编辑器功能写文本代码
- Atom 更为先进的文本代码编辑器
- 文本编辑器 分页 分析图表控件
- 高级语言案例分析_文本编辑器
- 文本编辑器
- 文本编辑器
- 文本编辑器
- 文本编辑器
- 图算法 具有负边值有向图的单源最短路径
- 使用grep来查找当前文件夹下边所有包含某个字符串的文件
- 修改RT5370网卡VID/PID
- mysql join的实现原理及优化思路
- 如何理解oracle 11g scan ip
- 文本编辑器代码分析
- SpannableString对象赋值为String 资源里面定义的字符串
- html 语法学习
- iOS高效开发必备的10款Objective-C类库
- poj1502 MPI Maelstrom 最短路
- fatal error C1189: #error : "This file was generated using the moc from 4.4.3. It
- 湫湫系列故事——植树节
- ubuntu下命令(一)
- LDR 、ADR介绍