实例说明:
编辑一个简单的单行文本编辑器,编辑命令有以下几种:(E、Q、R、I、D)
只有自己在完全空白的情况下编写出来的程序,才是真正自己会的程序,现在所做的,不过是程序的搬运工,把书上的程序搬到网上,不过是添加了几句注释而已。
#include <stdio.h>
#include <stdlib.h>
#include <string.h> #define MAXLEN 80 //所处理文本一行最大字符个数
#define MAXLINE 200 //所处理文本最大行数 char buffer[MAXLEN]; //用来存储命令行输入的命令,以及命令所带的参数
char fname[]; //用来存储所处理文件的文件名
char *lineptr[MAXLINE]; //行指针
FILE *fp; //文件指针
void edit(),replace(),insert(),delete(),quit(); //函数声明,具体的函数定义在后面
char comch[] = "EeRrIiDdQq"; //命令符
void(*comfun[])() = {edit,replace,insert,delete,quit}; //对应处理函数
int modified=; //正文修改标志
int last; //当前正文行数
char *chpt; //输入命令行字符指针 int main()
{
int j;
last = ; while()
{
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=; comch[j]!='\0'&&comch[j]!=*chpt; j++); //查找命令符对应的处理函数
if(comch[j]=='\0') continue; //非法命令符
chpt++; //掠过命令符,指向参数
(*comfun[j/])(); //执行对应的函数
fprintf(stdout,"The text is :\n");
for(j=; j<last; j++) //显示正文文本
fputs(lineptr[j],stdout);
}
return ;
} //====================================================================================
//函数名称:void quit()
//函数功能:结束编辑
//对应命令:q/Q
//入口参数:无
//出口参数:无
//====================================================================================
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=; c<last; c++)
free(lineptr[c]); //释放内存
exit();
} //====================================================================================
//函数名称:void insert()
//函数功能:将I/i命令后继的K行文本插入到原始正文第M行之后
//入口参数:无
//出口参数:无
//命令格式:
//I K M
//K行正文
//====================================================================================
void insert()
{
int k,m,i;
sscanf(chpt, "%d%d", &k, &m);
if(m<||m>last||last+k>=MAXLINE) //判断插入文本位置是否正确
{
printf("Error!\n");
return;
}
for(i=last; i>m; i--) //后继行向后移
lineptr[i+k-] = lineptr[i-];
for(i=; i<k; i++) //读入k行正文,并插入
{
fgets(buffer, MAXLEN, stdin);
lineptr[m+i] = (char *)malloc(strlen(buffer)+);
strcpy(lineptr[m+],buffer);
}
last += k; //修改正文行数
modified = ; //标明正文已被修改
} //====================================================================================
//函数名称:void delete()
//函数功能:将原始正文中第M行至第N行的正文内容删去
//入口参数:无
//出口参数:无
//命令格式:
//D M N
//====================================================================================
void delete()
{
int i,j,m,n;
sscanf(chpt, "%d%d", &m,&n);
if(m<=||m>last||n<m) //检查参数合理性
{
printf("Error!\n");
return;
}
if(n>last)
n = last; //修正参数
for(i=m; i<=n; i++) //删除正文
free(lineptr[i-]);
for(i=m,j<n+; j<=last; i++,j++) //将原文的N行之后的文本前移
lineptr[i-] = lineptr[j-];
last = i-;
modified = ;
} //====================================================================================
//函数名称:void replace()
//函数功能:用R命令后继的K行正文替代原始正文中的M行到N行的正文内容
//入口参数:无
//出口参数:无
//命令格式:
//R K M N
//K行正文
//====================================================================================
void replace()
{
int k,m,n,i,j;
sscanf(chpt,"%d%d%d",&k,&m,&n); /* 读入参数 */
if(m<=||m>last||n<m||last-(n-m+)+k>=MAXLINE) /* 检查参数合理性 */
{
printf("Error!\n");
return;
}
/* 先完成删除 */
if(n>last)
n=last; /* 修正参数 */
for(i=m;i<=n;i++) /* 删除正文 */
free(lineptr[i-]);
for(i=m,j=n+;j<=last;i++,j++) //文本前移
lineptr[i-]=lineptr[j-];
last=i-;
/* 以下完成插入 */
for(i=last;i>=m;i--)
lineptr[i+k-]=lineptr[i-];
for(i=;i<k;i++)
{
fgets(buffer,MAXLEN,stdin);
lineptr[m+i-]=(char *)malloc(strlen(buffer)+);
strcpy(lineptr[m+i-],buffer);
}
last+=k; /* 修正正文行数 */
modified=; /* 正文被修改 */
} //====================================================================================
//函数名称:void save(char *fname)
//函数功能:用来保存文本
//入口参数:char *fname
//出口参数:无
//====================================================================================
void save(char *fname) /* 保存文件 */
{
int i;
FILE *fp;
if((fp=fopen(fname,"w"))==NULL)
{
fprintf(stderr,"Can't open %s.\n",fname);
exit();
}
for(i=;i<last;i++)
{
fputs(lineptr[i],fp);
free(lineptr[i]);
}
fclose(fp);
} //====================================================================================
//函数名称:void edit()
//函数功能:指定所要编辑的文本
//入口参数:无
//出口参数:无
//====================================================================================
void edit() /* 编辑命令 */
{
int i;
FILE *fp;
i=sscanf(chpt,"%s",fname); /* 读入文件名 */
if(i!=)
{
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=;
while(fgets(buffer,MAXLEN,fp)==buffer)
{
lineptr[i]=(char *)malloc(strlen(buffer)+);
strcpy(lineptr[i++],buffer);
}
fclose(fp);
last=i;
}