#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=0comch[j]!='\0'&&comch[j]!=*chptj++)/*查命令符*/
if(comch[j]=='\0') continue/*非法命令符*/
chpt++/*掠过命令符,指向参数*/
(*comfun[j/2])()/*执行对应函数*/
fprintf(stdout,"The text is:\n")
for(j=0j<lastj++)/*显示正文*/
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=0c<lastc++)
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=lasti>mi--)/* 后继行向后移 */
lineptr[i+k-1]=lineptr[i-1]
for(i=0i<ki++) /* 读入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=mi<=ni++) /* 删除正文 */
free(lineptr[i-1])
for(i=m,j=n+1j<=lasti++,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=mi<=ni++) /* 删除正文 */
free(lineptr[i-1])
for(i=m,j=n+1j<=lasti++,j++)
lineptr[i-1]=lineptr[j-1]
last=i-1
/* 以下完成插入 */
for(i=lasti>=mi--)
lineptr[i+k-1]=lineptr[i-1]
for(i=0i<ki++)
{
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=0i<lasti++)
{
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
}
我这里有一个功能强大文本编译器程拦歼序的卖衡仔完整c代码,是外国人写的。不好意思,很中汪长,发不上来。不过这里有一个简易文本编译器。虽说是简易,也不是那么好弄的,给你:
http://zhidao.baidu.com/question/79338502.html
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)