C语言编写的记事本源代码

时间:2013.10.01 发布人:l763686626

C语言编写的记事本源代码

已解决问题

谷歌l763686626用户在2013.10.01提交了关于“雪纳瑞C语言编写的记事本源代码”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2024-11-14T22:06:19。记事本(正文编辑系统)
正文编辑的实质是修改字符**的形式或格式。虽然各种正文编辑程序的功能强弱不同,但其基本功能大致相同,一般都包括串的查找、插入、删除和修改等基本操作。
例如,在编辑系统中,可以将整个文本编辑区看成是一个“串”,每一行是一个子串。采用链表结构,可设结点大小为一行中的字符个数。即:同一行的串用定长结构(80个字符),行和行之间用指针相联接。
或者
在正文编辑程序中设立页指针、行指针和字符指针,分别指示当前操作的页、行和字符。
如果在某行内插入或删除若干字符,则要修改行表中该行的长度,若该行长度因插入而超出了原分配给它的存储空间,则要为该行重新分配存储空间,并修改该行的起始位置。希望大家能够帮助她。

详细问题描述及疑问:记事本(正文编辑系统)
正文编辑的实质是修改字符**的形式或格式。虽然各种正文编辑程序的功能强弱不同,但其基本功能大致相同,一般都包括串的查找、插入、删除和修改等基本操作。
例如,在编辑系统中,可以将整个文本编辑区看成是一个“串”,每一行是一个子串。采用链表结构,可设结点大小为一行中的字符个数。即:同一行的串用定长结构(80个字符),行和行之间用指针相联接。
或者
在正文编辑程序中设立页指针、行指针和字符指针,分别指示当前操作的页、行和字符。
如果在某行内插入或删除若干字符,则要修改行表中该行的长度,若该行长度因插入而超出了原分配给它的存储空间,则要为该行重新分配存储空间,并修改该行的起始位置。期待您的答案,谢了,下次有事儿别忘了找我 !

希望以下的回答,能够帮助你。

第1个回答

用户名:MYWORJD  

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<st问答dlib.h>
#includ简困e<ctype.h>
#define**LL0
#defineMAX表磁交许最100

typedefstructlnode{

chardate[MAX];//存放**
structlnode双非黑经留三基挥间左跟*prior;//前驱
structlnode*next;//后继
int**mber;//记反几录一个节点的字符数!鱼发主件深概衣独露如果是头节点就记录他的节点个数
intquese;//记录节点在链表中的位置

}lnodetype;

lnodetype*l;//设置两个全局变量,分别是头节点指划七针和尾节点指针
lnodetype*end;

//**********这个函数是用来初始化的**普图营级升好短称今血********//
intiniatelist提基久威十般交议施首(lnodetype**l,lnodetype**end)
{

(*l)=(lnodetype低乱损皮*)malloc(酒责灯否sizeof(lnodetype));
if((*l)==**LL)
{

printf("没有只够的内存空间!程序即将退出!");
return0;

}

(*l)->prior=(*l)->next=**LL;//这是双链表
(*l)->**mber=(*l)->quese=0;
(*end)=(*l);

p派且达rintf("程序初始化完毕!")阿若求初管继告校院门头;
return0;

}

//**********这个函数是用来建立节点,并且插入元素的**********//
intlink(lnodetype**l,lnodetype**end)
{

lnodetype甚左三并介父印*s;
s=(lnodetype*)malloc(sizeof(lnodetype));
i晶千息心轮面多沉f(s==**LL){

printf("内存空间不够,程判序即将退出!");
return0;

}

(*end李封载积)->next=s;
s->prior=(*end);
本操画洋(*end)=(*end)->next;
(*帮么临盐云宜袁l)->**mber++;//增加一个节点,头节点的**mber就加1
s->quese=(*l)->**mber;//这个是记录节点在链表中的位置

printf("%d行",s->quese);//这个是节点在整个链表中的位置
gets(s->date);
s->**mber=strlen(s->date);
return0;

}

//**********这个是打印链表的函数**********//
intprin(lnodetype**l,lnodetype**end)
{

lnodetype*p;
inti;
intj=0;
intcouter=(*l)->**mber;
p=(*l)->next;

for(i=0;i<couter;i++){

printf("%d行",i+1);
j=0;
while((p->date[j]>='a'&&p->date[j]<='z')||
(p->date[j]>='A'&&p->date[j]<='z')||
p->date[j]>='0'&&p->date[j]<='9')
{

printf("%c",p->date[j]);
j++;

}
printf("n");
p=p->next;

}

return0;

}

//*********这个查找和编辑相应行的函数**********//
intsearch(lnodetype**l,lnodetype**end)
{

int**mber;
scanf("%d",&**mber);
inti;
lnodetype*p;
p=(*l)->next;

for(i=0;i<**mber-1;i++)
p=p->next;

printf("%d行",**mber);
gets(p->date);
return0;

}

//**********这个是在文本文件里搜索字符串的函数**********//
intsearchstr(lnodetype**l,lnodetype**end)
{

charptr[100];
intarrycouter;
intmystrcmp(char*,char*,int);

printf("ok!现在输入你查找的字符串!");
scanf("%s",ptr);
arrycouter=strlen(ptr);
lnodetype*s;
s=(*l)->next;
char*p;

inti=1;
intcouter=0;
int**mber=(*l)->**mber;
p=(char*)s->date;

while(i&&**mber){

//i=1是,明没有找到,向第二个节点继续寻找

while(i&&(((*p>='a')&&(*p<='z'))||((*p>='A')&&(*p<='Z')))){

i=mystrcmp(p,ptr,arrycouter);

if(i==1){

printf("字符串已经在第%d行,第%d个字符开始,",s->quese,couter+1);
i=0;
}
else
{
p++;
couter++;
i=1;
}

}

s=s->next;
p=(char*)s->date;
**mber--;

}

if(i==1)
printf("字符串在本文档中不存在!");
return0;

}

//**********(1)这个函数是用来实现退出不保存功能的**********//
intexituns**e(lnodetype**l,lnodetype**end)
{

lnodetype*s;
while((*l)!=(*end)){//如果不保存的话,最好是把节点的空间都释放,节省空间

s=(*end);
(*end)=(*end)->prior;
free(s);

}

return0;

}

//**********(2)这个函数是用来实现退出但保存功能的**********//
intquitands**e(lnodetype**l,lnodetype**end)
{

FILE*fp;
charch;
charfilename[20];
lnodetype*p;
inti;
intj;
intcouter=(*l)->**mber;

p=(*l)->next;

printf("请输入文件名:");
scanf("%s",filename);

if((fp=fopen(filename,"w"))==**LL){

printf("文件不能打开!n");
return0;

}

for(i=0;i<couter;i++){//有几个节点就进行多少次的存贮

ch=p->date[0];
j=1;

while(ch!='\0'){

fputc(ch,fp);
ch=p->date[j];
j++;

}

p=p->next;
fputc('#',fp);//注意在每个节点的后面加上结束的符号

}

fputc('@',fp);//整个文件关闭的标志
fclose(fp);//注意关闭文件,
return0;

}
//**********由于库函数比较字符串提供的功能不满足要求,故自己写了一个**********/
intmystrcmp(char*p,char*sour,int**mber)
{

while(**mber&&(*p)==(*sour)&&
(((*p>='a')&&(*p<='z'))||((*p>='A')&&(*p<='Z')))){

p++;
sour++;
**mber--;

}

if(**mber==0)
return1;
else
return0;

}
//**********这个函数是用来实现统计字符串功能的**********//
intcoutword(lnodetype**l,lnodetype**end)
{//考虑到只统计一行的单词没有意义,故统计整个文本

intyes=1;//这个是进入单词的标志
intno=0;//在单词外面的时候的标志
inti,j,inaword,count=0;
inaword=no;
lnodetype*s=(*l)->next;

for(j=0;j<(*l)->**mber;j++){

for(i=0;(s->date[i]>='a'&&s->date[i]<='z')||
(s->date[i]>='A'&&s->date[i]<='z')||
(s->date[i]>='0'&&s->date[i]<='9')||
(s->date[i]=='');i++)
{

if(s->date[i]=='')
inaword=no;
else
if(inaword==no)
{
inaword=yes;
count++;//计算单词
}

}

s=s->next;
inaword=0;//注意这里,把标志置为0了!

}

printf("n文本一**有%d行",(*l)->**mber);
printf("n此文本一**有%d个单词!",count);

returncount;

}
//**********这个函数是用来实现计算文本行数功能的**********//
intlinecouter(lnodetype**l,lnodetype**end)
{

intcouter;
couter=(*l)->**mber;
returncouter;

}

//**********这个函数是整和一上所有功能的菜单函数**********//
inteditme**(lnodetype**l,lnodetype**end)
{

charchoice;
char*p="cls";
inti=1;//这两个变量是用来控制循环的
intj=1;
system(p);
prin(&(*l),&(*end));

while(j){

printf("***********************************e:编辑相应行*************************************n");
printf("***********************************s:搜索字符串*************************************n");
printf("***********************************t:统计单词个数***********************************n");
printf("***********************************q:退出编辑***************************************n");

scanf("%c",&choice);
scanf("%c",&choice);//????莫名其妙的问题,非要两个请求输入语句才肯停下来!
switch(choice)
{
case'e':{
i=1;
while(i)
{
search(&(*l),&(*end));
system(p);
prin(&(*l),&(*end));
printf("n1继续编辑0结束编辑n");
scanf("%d",&i);

}

}

bre**;
case's':{

i=1;
while(i)
{
searchstr(&(*l),&(*end));
getchar();
getchar();
system(p);
prin(&(*l),&(*end));
printf("n1继续搜索0结束搜索n");
scanf("%d",&i);

}

}
bre**;
case't':{

coutword(&(*l),&(*end));
getchar();

}bre**;

default:return0;

}

system(p);
prin(&(*l),&(*end));
printf("n1回到编辑菜单0结束编辑n");
scanf("%d",&j);
if(j==1)
system(p);
else
return0;

}

return0;
}

//**********实现第一个模块:新建空白文档**********//
intnewtext(lnodetype**l,lnodetype**end)
{

printf("新文本文件:n");
inti=1;
charjudstr[MAX];
lnodetype*temp;
charjud;
char*p="cls";

while(1){

link(&(*l),&(*end));
jud=(*end)->date[0];

if(jud=='5'){//输入‘5’结束一切

temp=(*end);
(*end)=(*end)->prior;
free(temp);

while(1){

printf("*******************************out:退出不保存****************************n");
printf("*******************************edit:编辑信息*****************************n");
printf("*******************************quit:退出而不存盘**************************n");
printf("*******************************qas:退出且存盘****************************n");
printf("*******************************con:继续输入!*****************************n");

gets(judstr);

if(!strcmp(judstr,"out"))
{
exituns**e(&(*l),&(*end));
return0;
}
else
if(!strcmp(judstr,"qas"))
{
quitands**e(&(*l),&(*end));
return0;
}
else

if(!strcmp(judstr,"edit"))
{

editme**(l,end);
return0;

}

system(p);

}
return0;

}

}

return0;

}

//**********这个是装入文件的函数**********//
intloadtaxt(char*filename)
{

FILE*fp;
lnodetype*l;
charch;
inti=0;
char*p="cls";
charjudstr[MAX];
lnodetype*head;
lnodetype*end;

iniatelist(&head,&end);
l=end=head;

if((fp=fopen(filename,"r+"))==**LL){

printf("文件不能打开!n");
return0;

}

ch=fgetc(fp);
while(ch!='@'){

lnodetype*s;
s=(lnodetype*)malloc(sizeof(lnodetype));
if(s==**LL){

printf("内存空间不够,程序即将退出!");
return0;

}

end->next=s;
s->prior=end;
end=end->next;
l->**mber++;
s->quese=l->**mber;
printf("%d行",s->quese);

while(ch!='#'){

s->date[i]=ch;
ch=fgetc(fp);
i++;

}
i=0;
while((end->date[i]>='a'&&end->date[i]<='z')||
(end->date[i]>='A'&&end->date[i]<='z')||
(end->date[i]>='0'&&end->date[i]<='9')||
(end->date[i]==''))
{

printf("%c",end->date[i]);
i++;

}
end->date[i]='\0';//注意在节点的最好加上这个,以让退出保存功能函数知道此节点已结束

printf("n");
i=0;
ch=fgetc(fp);

}

fclose(fp);

printf("n文件成功装入!n");
while(1){

printf("*******************************out:退出不保存****************************n");
printf("*******************************edit:编辑信息*****************************n");
printf("*******************************qas:退出且存盘****************************n");
printf("*******************************con:继续输入!*****************************n");

scanf("%s",judstr);

if(!strcmp(judstr,"out"))
{
exituns**e(&l,&end);
return0;
}
else
if(!strcmp(judstr,"qas"))
{
quitands**e(&l,&end);
return0;
}
else

if(!strcmp(judstr,"edit"))
{

editme**(&l,&end);
return0;

}

system(p);

}

return0;

}

//**********主函数**********//

voidmain(void)
{

//iniatelist(&l,&end);
//newtext(&l,&end);

charfilename[MAX];
scanf("%s",filename);
loadtaxt(filename);

}
很不容易做的程序!!!
通过编译