本文实例为大家分享了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