文本编辑器代码分析

本文分析了文本编辑器的实现,主要关注栈结构在行编辑中的作用。功能包括:输入字符非'#'、'@'时压栈,'#'时出栈顶部元素,'@'时清空栈。当接收到回车或EOF时结束。总结中提到,使用固定长度栈编辑一行,而文本编辑器以链表形式管理多行文本,利用strstr()查找字符串,并在保存和装载文件时处理换行符。
摘要由CSDN通过智能技术生成

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

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、简单的文本编辑器设计报告

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值