文本编辑代码.docx
《文本编辑代码.docx》由会员分享,可在线阅读,更多相关《文本编辑代码.docx(18页珍藏版)》请在冰点文库上搜索。
![文本编辑代码.docx](https://file1.bingdoc.com/fileroot1/2023-6/11/10bf33d9-7d00-43e8-96c9-5f3a159b7ecc/10bf33d9-7d00-43e8-96c9-5f3a159b7ecc1.gif)
文本编辑代码
#include
#include
#include"chuan.cpp"
voidmain()
{
chars[100000];
chart[100000];
charp[100000];
charq[100000];
FILE*fp;
charch,name[20];
inti,j,k,n,m,l=0,num=0;
HStringS,T,P;
InitString(S);
InitString(T);
InitString(P);
printf("\n请输入您要进行的操作的代码:
\n0.打开文本。
\n1.输入字符。
\n");
scanf("%d",&m);
if(!
m)
{
printf("请输入打开文件的地址\n");
scanf("%s",name);
if((fp=fopen(name,"r+"))==NULL)
{
printf("cannotopenthefile!
");
exit(0);
}
ch=fgetc(fp);
while(ch!
=EOF)
{
q[l]=ch;
ch=fgetc(fp);
l++;
num++;
}
q[num]=NULL;
StrAssign(S,q);
printf("文本的字符数为:
\n%d\n",S.length);
print(S);
fclose(fp);
}
else
{
printf("请输入文本:
\n");
scanf("%s",&s);
StrAssign(S,s);
printf("文本字符数为%d\n文本处理为每行5字符的格式,处理后的文本如下:
\n",S.length);
print(S);
}
while(k)
{
printf("\n请输入您要进行的操作的代码:
\n1.查找字符。
\n2.插入字符。
\n3.删除字符。
\n");
scanf("%d",&n);
switch(n)
{
case1:
{
while(n)
{
printf("请输入需查找的字符:
");
scanf("%s",&p);
StrAssign(P,p);
Search(S,P);
printf("是否继续查找?
\n0.no\n1.yes\n");
scanf("%d",&n);
}
break;
}
case2:
{
while(n)
{
printf("请输入需插入字符的位置:
\n");
printf("页位置:
\n");
scanf("%d",&i);
printf("行位置:
\n");
scanf("%d",&j);
printf("第几个位置后:
\n");
scanf("%d",&k);
if(k>5||((i-1)*20+j-1)*5+k>S.length)
{
printf("error!
\n");
break;
}
printf("请输入需插入的字符:
\n");
scanf("%s",&t);
StrAssign(T,t);
insert(S,T,i,j,k);
printf("插入后所得文本字符数为:
%d\n插入后所得文本:
\n",S.length);
print(S);
printf("\n是否继续插入字符?
\n0.no\n1.yes\n");
scanf("%d",&n);
}
break;
}
case3:
{
while(n)
{
printf("请选择删除方式:
\n1.删除整行\n2.删除具体位置的字符\n");
scanf("%d",&n);
strdelete(S,n);
printf("\n删除后所得字符总数:
\n%d\n",S.length);
printf("删除后所得文本:
\n");
print(S);
printf("\n是否继续删除?
\n0.no\n1.yes\n");
scanf("%d",&n);
}
break;
}
default:
{
printf("error!
!
!
\n");
break;
}
}
printf("是否继续进行操作?
\n0.no\n1.yes\n");
scanf("%d",&k);
if(!
m)
{
fp=fopen(name,"w+");
fprintf(fp,"%s",S);
fclose(fp);
}
}
}
#include"stdlib.h"
#include"stdio.h"
#include"string.h"
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineOVERFLOW-1
#defineMAXCSIZE100
typedefintStatus;
typedefstruct
{
char*ch;
intlength;
}HString;
StatusInitString(HString&T)
{
T.ch=(char*)malloc(MAXCSIZE*sizeof(char));
if(!
T.ch)
returnERROR;
T.length=0;
returnOK;
}
StatusStrAssign(HString&T,char*chars)
{//生成一个其值等于串常量chars的串T
inti,k;
//char*c;
if(T.ch)free(T.ch);//释放T原有空间
//for(i=0,c=chars;c!
='\0';++i,++c);//求chars的长度i
i=strlen(chars);
if(!
i)
{
T.ch=NULL;
T.length=0;
}
else
{
if(!
(T.ch=(char*)malloc(i*sizeof(char))))
exit(OVERFLOW);
for(k=0;k
T.ch[k]=chars[k];
T.length=i;
}
returnOK;
}
intStrLength(HStringS)
{
returnS.length;
}
intStrCompare(HStringS,HStringT)
{
inti;
for(i=0;iif(S.ch[i]!
=T.ch[i])
returnS.ch[i]-T.ch[i];
returnS.length-T.length;
}
StatusClearString(HString&S)
{
if(S.ch)
{
free(S.ch);
S.ch=NULL;
}
S.length=0;
returnOK;
}
StatusConcat(HString&T,HStringS1,HStringS2)
{//用T返回由S1和S2连接而成的新串
inti;
if(T.ch)free(T.ch);
if(!
(T.ch=(char*)malloc((S1.length+S2.length)*sizeof(char))))
exit(OVERFLOW);
for(i=0;iT.ch[i]=S1.ch[i];
T.length=S1.length+S2.length;
for(i=0;iT.ch[S1.length+i]=S2.ch[i];
returnOK;
}
StatusSubString(HString&Sub,HStringS,intpos,intlen)
{//用Sub返回串S的第pos个字符起长度为len的子串
inti;
if(pos<1||pos>S.length||len<0||len>S.length-pos+1)
returnERROR;
if(Sub.ch)free(Sub.ch);
if(!
len)
{
Sub.ch=NULL;
Sub.length=0;
}
else
{
Sub.ch=(char*)malloc(len*sizeof(char));
for(i=0;iSub.ch[i]=S.ch[i+pos-1];
Sub.length=len;
}
returnOK;
}
intIndex(HStringS,HStringT,intpos)
{//返回子串T在主串S中第pos个字符之后的位置。
若不存在,则函数值为0
inti=pos,j=1;
while(i<=S.length&&j<=T.length)
{
if(S.ch[i-1]==T.ch[j-1])
{
++i;++j;
}
else
{
i=i-j+2;
j=1;
}
}
if(j>T.length)
returni-T.length;
else
return0;
}
voidPrintString(HStringS)
{
inti;
for(i=0;iprintf("%c",S.ch[i]);
printf("\n");
}
StatusStrDelete(HString&S,intpos,intn)
{
if(S.lengthinti=pos;
for(i;iS.ch[i-1]=S.ch[i+n-1];
S.length=S.length-n;
returnOK;
}
StatusDeleteSame(HString&S,HString&T)
{//从串S中删除所有和串T相同的子串
if(S.lengthinti=1;
for(i;i<=S.length-T.length+1;)//当S.length在不断减少,i就不能随之增加了
{
//printf("%d\n",Index(S,T,1));
if(Index(S,T,1))
{
StrDelete(S,Index(S,T,1),T.length);//printf("%d\n",S.length);PrintString(S);
if(S.lengthPrintString(S);
}
else
{
PrintString(S);break;
}
}
returnOK;
}
voidget_next(HStringS,intnext[])
{//求模式串T的next函数值并存入数组next
inti=1;
next[1]=0;
intj=0;
while(i{
if(j==0||S.ch[i-1]==S.ch[j-1])
{
++i;++j;
next[i]=j;
}
else
j=next[j];
}
printf("next值:
\n");
for(i=1;i<=S.length;i++)
printf("%d",next[i]);
printf("\n");
}
voidget_nextval(HStringS,intnextval[])
{//求模式串T的next函数值并存入数组next
inti=1;
nextval[1]=0;
intj=0;
while(i{
if(j==0||S.ch[i-1]==S.ch[j-1])
{
++i;++j;
if(S.ch[i-1]!
=S.ch[j-1])
nextval[i]=j;
else
nextval[i]=nextval[j];
}
else
j=nextval[j];
}
printf("nextval值:
\n");
for(i=1;i<=S.length;i++)
printf("%d",nextval[i]);
printf("\n");
}
voidinsert(HString&S,HString&T,inti,intj,intk)
{
intn,m,l=0,x;
m=T.length;
printf("插入的字符数为:
%d\n",m);
x=S.length;
n=((i-1)*20+j-1)*5+k;
for(x=x+m;x>=n+m;x--)
S.ch[x-1]=S.ch[x-m-1];
for(l=0;l<=m-1;l++)
{
S.ch[n]=T.ch[l];
n++;
S.length++;
}
S.ch[S.length]=NULL;
}
voidSearch(HStringS,HStringP)
{
inti=0,l=0,t=1,r;
inta,b,c;
while(i<=S.length-1)
{
r=P.length;
while(t!
=0&&r!
=0)
{
if(S.ch[i+t-1]==P.ch[t-1])
{t++;r--;}
else
{t=0;}
}
if(t==0)
{i=i+1;t=1;}
else
{
a=(i+1)/100+1;
b=((i+1)-(i+1)/100*100)/5+1;
c=(i+1)%5;
if(c==0)
{
c=5;b=b-1;
}
printf("在第%d页,第%d行,第%d个位置\n",a,b,c);
l++;
i=i+1;
t=1;
}
}
printf("字符一共出现%d次\n",l);
}
voidstrdelete(HString&S,intn)
{
inti,j,m,l,k;
switch(n)
{
case1:
{
printf("请输入需删除的行的位置:
\n页数:
\n");
scanf("%d",&i);
printf("行数\n");
scanf("%d",&j);
if(((i-1)*20+j-1)*5>S.length)
{
printf("error!
");
break;
}
l=S.length-((i-1)*20+j-1)*5;
if(l>=5)
{
for(m=((i-1)*20+j-1)*5;m<=S.length-6;m++)
S.ch[m]=S.ch[m+5];
l=5;
}
else
{
for(m=((i-1)*20+j-1)*5,k=1;k<=l;m++,k++)
S.ch[m]=NULL;
}
S.length-=l;
S.ch[S.length]=NULL;
break;
}
case2:
{
printf("请输入需删除字符的起始位置及字符总个数:
\n页数:
\n");
scanf("%d",&i);
printf("行数\n");
scanf("%d",&j);
printf("所在位置:
\n");
scanf("%d",&k);
printf("字符个数:
\n");
scanf("%d",&l);
if(((i-1)*20+j-1)*5+k+l-1>S.length)
{
printf("error!
");
break;
}
for(m=((i-1)*20+j-1)*5+k-1;m<=S.length-l-1;m++)
S.ch[m]=S.ch[m+l];
S.length-=l;
S.ch[S.length]=NULL;
break;
}
default:
{
printf("error!
\n");
break;
}
}
}
voidprint(HString&S)
{
inti,j,k,n,m=0;
while(m+1<=S.length)
{
i=(m+1)/100+1;
j=((m+1)-(m+1)/100*100)/5+1;
k=(m+1)%5;
printf("\n第%d页第%d行字符为:
",i,j);
for(n=1;n<=5;n++)
{
if(m+1>S.length)
break;
else
printf("%c",S.ch[m]);
m++;
}
}
}