当前位置: 首页 > news >正文

039.简单的文本编辑器

#include <stdio.h>
#define MAXLEN 80
#define MAXLINE 200
char buffer[MAXLEN],fname[120];
char *lineptr[MAXLINE];
FILE *fp;
void edit(),replace(),insert(),delete(),quit();
char comch[]="EeRrIiDdQq";/*命令符*/
void(*comfun[])()={edit,replace,insert,delete,quit};/*对应处理函数*/
int modified=0,/*正文被修改标志*/last;/*当前正文行数*/
char *chpt;/*输入命令行字符指针*/main()
{int j;last=0;while(1){printf("\nInput a command:[e,r,i,d,q].\n");gets(buffer);/*读入命令行*/for(chpt=buffer;*chpt==''||*chpt=='\t';chpt++);/*掠过空白符*/if(*chpt=='\0') continue;/*空行重新输入*/for(j=0;comch[j]!='\0'&&comch[j]!=*chpt;j++);/*查命令符*/if(comch[j]=='\0') continue;/*非法命令符*/chpt++;/*掠过命令符,指向参数*/(*comfun[j/2])();/*执行对应函数*/fprintf(stdout,"The text is:\n");for(j=0;j<last;j++)/*显示正文*/fputs(lineptr[j],stdout);}
}
void quit()
{int c;if(modified)/* 如正文被修改 */{printf("Save? (y/n)");while(!(((c=getchar())>='a'&&c<='z')||(c>='A'&&c<='Z')));if(c=='y'||c=='Y')save(fname); /* 保存被修改过的正文 */}for(c=0;c<last;c++)free(lineptr[c]);	/* 释放内存 */exit(0);
}void insert()
{int k,m,i;sscanf(chpt,"%d%d",&k,&m);	/* 读入参数 */if(m<0||m>last||last+k>=MAXLINE)/* 检查参数合理性 */{printf("Error!\n");return;}for(i=last;i>m;i--)/* 后继行向后移 */lineptr[i+k-1]=lineptr[i-1];for(i=0;i<k;i++)   /* 读入k行正文,并插入 */{fgets(buffer,MAXLEN,stdin);lineptr[m+i]=(char *)malloc(strlen(buffer)+1);strcpy(lineptr[m+i],buffer);}last+=k;	/* 修正正文行数 */modified=1;	/* 正文被修改 */
}void delete()
{int i,j,m,n;sscanf(chpt,"%d%d",&m,&n);	/* 读入参数 */if(m<=0||m>last||n<m)	/* 检查参数合理性 */{printf("Error!\n");return;}if(n>last)n=last;		/* 修正参数 */for(i=m;i<=n;i++)	/* 删除正文 */free(lineptr[i-1]);for(i=m,j=n+1;j<=last;i++,j++)lineptr[i-1]=lineptr[j-1];last=i-1;	/* 修正正文行数 */modified=1;	/* 正文被修改 */
}void replace()
{int k,m,n,i,j;sscanf(chpt,"%d%d%d",&k,&m,&n);	/* 读入参数 */if(m<=0||m>last||n<m||last-(n-m+1)+k>=MAXLINE)/* 检查参数合理性 */{printf("Error!\n");return;}/* 先完成删除 */if(n>last)n=last;		/* 修正参数 */for(i=m;i<=n;i++)	/* 删除正文 */free(lineptr[i-1]);for(i=m,j=n+1;j<=last;i++,j++)lineptr[i-1]=lineptr[j-1];last=i-1;/* 以下完成插入 */for(i=last;i>=m;i--)lineptr[i+k-1]=lineptr[i-1];for(i=0;i<k;i++){fgets(buffer,MAXLEN,stdin);lineptr[m+i-1]=(char *)malloc(strlen(buffer)+1);strcpy(lineptr[m+i-1],buffer);}last+=k;	/* 修正正文行数 */modified=1;	/* 正文被修改 */
}save(char *fname)	/* 保存文件 */
{int i;FILE *fp;if((fp=fopen(fname,"w"))==NULL){fprintf(stderr,"Can't open %s.\n",fname);exit(1);}for(i=0;i<last;i++){fputs(lineptr[i],fp);free(lineptr[i]);}fclose(fp);
}void edit()	/* 编辑命令 */
{int i;FILE *fp;i=sscanf(chpt,"%s",fname);	/* 读入文件名 */if(i!=1){printf("Enter file name.\n");scanf("%s",fname);}if((fp=fopen(fname,"r"))==NULL) /* 读打开 */{fp=fopen(fname,"w");	/* 如不存在,则创建文件 */fclose(fp);fp=fopen(fname,"r");	/* 重新读打开 */}i=0;while(fgets(buffer,MAXLEN,fp)==buffer){lineptr[i]=(char *)malloc(strlen(buffer)+1);strcpy(lineptr[i++],buffer);}fclose(fp);last=i;
}


http://www.taodudu.cc/news/show-6105737.html

相关文章:

  • mavon-editor编辑器与图片上传
  • 编辑器111
  • 题注中的图一.1变成图1.1
  • MySQL数据库实验(四):E-R图实例讲解
  • (一)1. 数据流图(DFD)概念及画法
  • 如何把word中的多级编号中的题注“图一.1”自动变成“图1.1”
  • 图一:入门篇
  • (宏) Word图片题注“图一-1”转化为“图1-1”
  • app性能测试怎么做
  • PCB布局和绘制的关键操作
  • 什么是CAD的模型和布局?
  • 阿里巴巴矢量图标库icon图标在线引用
  • 精灵随着鼠标的移动而移动
  • 【cocos2D-X】Plist使用 实现 移动精灵多图片动画
  • 移动设备上“精灵图”的制作适配
  • cocos2dx 精灵的移动(2)
  • Cocos2d-x 2.0 百例精讲:如何让一个精灵跟随触点移动
  • 在屏幕的任意位置拖拽,控制精灵移动
  • 精灵的移动效果,旋转效果
  • 【JavaScript】实现移动小精灵
  • 让视角随着精灵移动
  • 移动设备上“精灵图”的制作
  • 移动端精灵图的使用
  • Cocos2d-x随记(2)-精灵移动
  • buntu22.04安装WPS中文版(一百一十八)
  • 数数
  • 视网膜数据集(2)Messidor
  • realsense 相机的部分信息获取
  • Linux线程数和系统线程数查看
  • 数的表示与运算