一、采用栈结构的行编辑器
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、栈结构之行编辑程序
3、c语言中的EOF