一、简单文本编辑器程序
1、数据结构
typedef struct _list //行表结构
{
char data[80]; //记录一行字符
int length; //记录一行字符长度
struct _list *next; // 后继指针
struct _list *pre; //前趋指针
int row; //记录整篇文章的行数
}LinkList;
int NUM,C,N; //定义全局变量,Num用来记录行号,C用来记录子串在主串中出现的总次数
LinkList *head; //定义全局变量*head,文章首行头指针
主要还是链表存储,80个字符
2、Create()文本内容输入
for(j=0;j<LINK_SIZE;j++)// 控制一页
{ for(i=0;i<80;i++) //控制一行
{ ch=getchar(); //接收输入字符
temp->data[i]=ch; //给temp指向的行赋值
••••
temp->length++;//行中字符长度加1
if(ch=='#')
{NUM=j; break; //文章结束时,Num来记录整个文章的行数
}}}
#define Link_Size 100
这里面输入一段文字,getchar()并不需要等,输入过程中就会拷贝进去,输入"#"后,则会跳出循环
如果输入超过80个字符,则malloc一个字串结构,加入链表中,另外会初始化这char [80]个字符='\0'。
3、PrintWord()文本输出
输出的话,就以'#'作为标志,一个字符一个字符printf。
for(j=0;j<=NUM&&p!=NULL;j++)
{=for(i=0;(i<80)&&(p->data[i])!='#';i++)
{=printf("%c",p->data[i]);}
p=p->next; }
4、CountWord()文本内容统计
for(j=0;j<=NUM;j++)
{ for(i=0;(i<80)&&(temp->data[i])!='#';i++)
{ ch=temp->data[i];
if((ch>='A')&&(ch<='Z')) WORD++;//大写字母
else if((ch>='a')&&(ch<='z')) word++;//小写字母
else if((ch>='0')&&(ch<='9')) num++;//数字
else if(ch==' ') space++;//空格键
else if(ch==33||ch==34||ch==39||ch==44||ch==46||ch==58||ch==59||ch==63)
{punct++;}//分别是!\"\'\,\.\:\;\? 其中\是分隔符
}
sum=WORD+word+num;
}
主要看是否落在相应的字符区间
5、SearchWord()文本内容查找
方法:每个字符去匹配,即可。
char Data[20];//存储要搜索的字符串,定长20
if((temp->data[j])==Data[k])
k++;//将输入的查找字符与链表中信息比较,找到第一个相同的字符
else if(Data[k]!='\0')
{j=j-k; k=0; } // //从主串第j-k个位置重新查找
if(Data[k]=='\0')
{sum++;//此字符出现的次数加1
j=j-k+1; //j记录下该字符串出现的位置
printf("\t\t第%d次出现在第%d行第%d列\n",l,i+1,j+1);
l++;
k=0;
continue;}
temp=temp->next; //指向下一行
6、DeleteWord()文本内容删除
首先找到字符串所在位置,再将后面的字符往前移一行,根据定位的信息,如果不是最后一行,则将后面的文字链往前移动。是最后一行,则只须拷贝字符串。
代码略。
7、InsertWord
插入也是如此。判断够不够,申请一个文字链,把文字往后面移动。
参考:1、简单的文本编辑器程序报告
2、anscii