本文实例为大家分享了C语言实现简单的文本编辑器的具体代码,供大家参考,具体内容如下
预期实现三个功能,第一,可以对指定的行输入字符串;第二,删除指定行的字符串;第三,显示编辑器的行数和内容。
我们通过块链结构来实现本程序。“块”的含义是每个块中可以存放多个字符,“链”的含义是块与块之间通过链表结构进行连接。
IDE : Code::Blocks 17.12
Compiler : GNU GCC Compiler
?| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 |
/*块链结构实现简单的文本编辑器*/
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
void Init(); //初始化编辑器
void input(); //对指定的行进行输入,#号结束
void Delline(); //删除指定的行
void List(); //显示文本编辑器的内容
int Menu(); //列出选择菜单并进行选择
//定义存放字符串的节点,块链结构
typedef struct node{
char data[50];
struct node *next;
}strnode;
//定义每行头节点
typedef struct head{
int number; //行号
int length; //字符串的长度
strnode * next;
}headnode;
//定义有100行
headnode Head[MAX];
//函数Init()实现每行头节点的初始化
void Init(){
int i;
for(i=0;i<MAX;++i){
Head[i].length=0;
}
}
//函数Menu()实现选择菜单
int Menu(){
int i;
i=0;
printf("-------------\n");
printf("1. Input\n");
printf("2. Delete\n");
printf("3. List\n");
printf("4. Exit\n");
printf("-------------\n");
while(i<=0 || i>4){
printf("please choose\n");
scanf("%d",&i);
}
return i;
}
//函数input(),向指定行中输入字符串
void input(){
strnode * p;
int i,j,LineNum;
char ch;
while(1){
j=-1;
printf("input the number of line(0~100),101-exit:\n");
scanf("%d",&LineNum); //输入要写入的行号
if(LineNum<0 || LineNum>=MAX){
return;
}
printf("please input,#-end\n");
i=LineNum;
Head[i].number=LineNum;
Head[i].next=(strnode *)malloc(sizeof(strnode));
p=Head[i].next;
p->next=NULL;
ch=getchar();
while(ch!='#'){
++j;
if(j>=50){ //如果字符串长度超过50,需要再分配一个节点空间
p->next=(strnode *)malloc(sizeof(strnode));
p->next->next=NULL;
p=p->next; //p指向新分配的节点
}
p->data[j%50]=ch; //将输入的字符放入data中
ch=getchar();
}
Head[i].length=j+1; //行的长度,以字符为单位
}
}
//函数Delline()实现对指定行的删除
void Delline(){
strnode * p,*q;
int i,LineNum;
while(1){
printf("input the number of line which do you want to delete(0~100),101-exit:\n");
scanf("%d",&LineNum); //输入要删除的行号
if(LineNum<0 || LineNum>=MAX){
return;
}
i=LineNum;
p=Head[i].next;
if(Head[i].length>0){
while(p!=NULL){
q=p->next;
free(p);
p=q;
}
Head[i].length=0;
Head[i].number=0;
}
}
}
//函数List()将输入的内容显示在屏幕上
void List(){
strnode *p;
int i,j,m,n;
for(i=0;i<MAX;++i){
if(Head[i].length>0){
printf("line%d",Head[i].number);
n=Head[i].length;
m=1;
p=Head[i].next;
for(j=0;j<n;++j){
if(j>=50*m){ //以50为基准,超过一个则指向下一个节点
p=p->next;
++m; //节点个数
}else{
printf("%c",p->data[j%50]); //将节点中内容输出
}
}
printf("\n");
}
}
printf("\n");
}
int main()
{
int sel;
Init(); //初始化编辑器
while(1){
sel=Menu();
switch(sel){ //对输入的数字进行选择
case 1:
input();
break;
case 2:
Delline();
break;
case 3:
List();
break;
case 4:
exit(0);
}
}
return 0;
}
|
测试运行结果如下:


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/Ibelievesunshine/article/details/80052038








发表评论
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。