C语言实现简易文本编译器

时间:2022-02-22 23:28:17

数据结构课程设计之简易文本编译器(C语言实现)

需求分析

(1)具有图形菜单界面:显示实时年份,日期,星期及时间

(2)

 查找:查找文本中的字符串,显示其出现的行数,列数及总共出现次数

 替换(等长,不等长):对文本中的文本实现等长及不等长替换

 插入(插串,文本块的插入):插入一行或在具体行号列号处插入文本

 块移动(行块,列块移动):向下移动一行,向上移动一行,

                         具体行号列号处向左移动或向右移动

 删除:删除一行,删除莫一行,莫列,定长的内容

(3)可正确存盘、取盘;:可读取,保存文本;

(4)正确显示总行数。(行数不少于5行,每行字符数不少于80个字符)

采用的数据结构

1:采用的逻辑结构

文本编辑器主要是针对文本进行编辑,文本的操作就是对字符的操作。文本编辑器可以从行、

列两个方向进行编辑。

每一行可以看成一个线性表,线性表是一种线性结构,线性结构的特点是数据元素之间为线性

关系,据元素“一个接一个的排列”。在一个线性表中数据元素的类型是相同的,由于每一行

可以存储的最大字数是相同的,行方向所有线性表的最大长度可以设置成相同的。行与行之间

的关系也可以看成一个线性表。

2.采用的存储结构

线性表的存储分为两种:顺序存储和链式存储。

顺序存储是指在内存中用地址连续的一块存储空间顺序存放线性表的各元素,用这种存储形式

存储的线性表称为顺序表。在程序设计语言中,一维数组在内存中占用的存储空间就是一组连续

的存储区域,因此,用一维数组来表示顺序表的数据存储区域是再合适不过的。

链式存储是通过-组任意的存储单元来存储线性表中的数据元素的,为建立数据元系之间的线性

关系对每个数据元素除了存放数据元素自身的信息之外,还需要和一起存放其后继或前驱所在的

存储单元的地址,这两部分信息组成一个“结点”,每个元素都如此。存放数据元素信息的称为

数据域,存放其前驱或后继地址的称为指针域。只有一个存储单元地址的为单链表,有两个存储

单元地址的为双链表。

考虑到实际的功能需求,每行的线性表可以用顺序存储方式,每个字符是一个节点。用数组的长

度表示本行可以输入的最大字符。行与行之间的线性表采用双链表存储,每个节点包括四个区域,

一个指针域prior指向上一行,一个指针域next指向下一行,一个数据域num是行号,一个数据

域是本行的字符数组。程序以行和列标识文本位置,行采用双向链表存储行信息,用数组下标标识

列信息,从而能够准确定位字符位置,然后进行查找、替换、插入、块移动、删除等多种操作。

函数功能模块图:

C语言实现简易文本编译器

定义的结构体:

?
1
2
3
4
5
6
7
8
9
10
struct line
 
{
 
    char  text[MAX_LEN];      //本行的文本
    int num;                 //行号
    struct line *next;       //指向下一行的指针
    struct line *prior;      //指向前一行的指针
 
 };

代码如下(仅供参考)

?
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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>
#define MAX 240
#define NOT_FOUND -1
//函数声明 
void HeadWord(void);      //输出大标题,永远出现在程序的最顶端。 
void PrintWord(void);    //输出文本的内容
void printf_time();      //输出时间和日期,星期及年月日
void scanf_load();       //从键盘录入文本
void file_load();        //把文本文件的内容读到线性表中
void findstr();          //查找字符串
void delete1(int linenum);//删除一行
void delete2(int linenum,int position,int lenth);//删除莫一行,莫列,定长的内容
void insert1();           // 插入一行文字
void insert2(char str[], int linenum, int position);//插入文字到文本莫一行莫一列
void replace();          //替换
void Mainmenu();          //主菜单
void menu1();                //文件录入方式菜单
void menu2();               //文本内容处理菜单
void menu_move();          //移动菜单
 
//定义结构体
struct line
{
 char text[MAX];      //该行的内容
 int num;                 //用来记录行号
 struct line *prior;      //用来指向前一行
 struct line *next;       //用来指向下一行
 };
struct line *start;          //指向线性表的第一行
struct line *last;           //指向线性表的最后一行
 
//主函数
int main()
{
 
 Mainmenu();
 return 0;
}
 
//输出标题,永远出现在程序的最顶端。
void HeadWord()
{
 
printf("\t\t ____________________________________________________\n\n");
printf("\t\t****    Welcom to use our TXT edition system!    ****\n");
printf("\t\t ____________________________________________________\n");
}
 
//  输出链表的内容
void PrintWord()
{
 
 struct line *p = start;
 while(p != last)
 {
  printf("\n\t\t第%d行|%s",p->num,p->text);
  p = p->next;
 }
 printf("\n\t\t第%d行|%s",last->num,last->text);
  printf("\n");
}
 
 
//输出时间和日期
void printf_time()
{
 
 time_t timep;
 struct tm *p;
 time (&timep);
 p=gmtime(&timep);
 //年月日
 printf("\t\t|Data:%d-%d-%d  |",1900+p->tm_year,1+p->tm_mon,p->tm_mday);
 
 //显示星期几
  printf("Today is ");
 switch (p->tm_wday)
    {
    case 7:  
        printf("Sunday   |");
        break;
    case 1:  
        printf("Monday   |");
        break;
    case 2:  
        printf("Tuesday  |");
        break;
    case 3: 
        printf("Wednesday|");
        break;
    case 4:
        printf("Thursday |");
        break;
    case 5: 
        printf(" Friday  |");
        break;
    case 6: 
        printf("Saturday |");
        break;
    default:
        break; }
 //让时间固定显示为 08:04:11类型,即当时,分,秒小于十时前加零
 if(p->tm_hour+8<10&&p->tm_min>10&&p->tm_sec>10)
 printf("Time:0%d:%d:%d |",p->tm_hour+8,p->tm_min,p->tm_sec);
 else if(p->tm_hour+8<10&&p->tm_min<10&&p->tm_sec>10)
 printf("Time:0%d:0%d:%d |",p->tm_hour+8,p->tm_min,p->tm_sec);
 else if(p->tm_hour+8<10&&p->tm_min<10&&p->tm_sec<10)
 printf("Time:0%d:0%d:0%d |",p->tm_hour+8,p->tm_min,p->tm_sec);
 else if(p->tm_hour+8>=10&&p->tm_min<10&&p->tm_sec<10)
 printf("Time:%d:0%d:0%d |",p->tm_hour+8,p->tm_min,p->tm_sec);
 else if(p->tm_hour+8>=10&&p->tm_min>=10&&p->tm_sec<10)
 printf("Time:%d:%d:0%d |",p->tm_hour+8,p->tm_min,p->tm_sec);
 else if(p->tm_hour+8>=10&&p->tm_min>=10&&p->tm_sec>=10)
 printf("Time:%d:%d:%d |",p->tm_hour+8,p->tm_min,p->tm_sec);
 else if(p->tm_hour+8>=10&&p->tm_min<10&&p->tm_sec>=10)
 printf("Time:%d:0%d:%d |",p->tm_hour+8,p->tm_min,p->tm_sec);
 else if(p->tm_hour+8<10&&p->tm_min>=10&&p->tm_sec<10)
 printf("Time:0%d:%d:0%d |",p->tm_hour+8,p->tm_min,p->tm_sec);
 
 
}
 
//把文本文件的内容读到线性表中
void file_load()
{
 struct line *info,*temp;                 //行指针,info指向当前行,temp指向info的前驱行
 char ch;
 temp = NULL;
 int linenum,i;          //行计数器,行字符数组下标
 FILE *fp;                             //文件指针
 char name[20];
 printf("请输入要打开文件名字(例如c:\\a.txt)");
 scanf("%s",name); 
 while ((fp=fopen(name,"r"))==NULL)
 {
   printf("\n打开文件失败,请重新输入要打开的文件名:");
   scanf("%s",name);
    }
 start = (struct line*)malloc(sizeof(struct line));     //生成一行的结点空间
 info = start;
 linenum = 1;
 
 while((ch = fgetc(fp)) != EOF)
 {    
   i = 0;
   info->text[i] = ch;
   i++;
   while((ch = fgetc(fp)) != '\n')      //从文件中读到一行字符到线性表中
   {
    info->text[i] = ch;
    i++;
   }
 info->num = linenum++;
 info->next = (struct line*)malloc(sizeof(struct line));
 if (!info->next)
 {
  printf("\n\t\t内存不足");
  getchar();
  exit(0);
 }
 
 temp = info;
 info = info->next;
 info->prior = temp;
  }
  last = info->prior;
  printf("\t\t文件读入完毕\n");
  fclose(fp);
  
}
 
//从键盘录入文本
void scanf_load()
{
 struct line *info,*temp;                 //行指针,info指向当前行,temp指向info的前驱行
 char ch;
 temp = NULL;
 int linenum,i;          //行计数器,行字符数组下标
 FILE *fp;                                 //文件指针
 temp = NULL;
 start = (struct line*)malloc(sizeof(struct line));     //生成一行的结点空间
 info = start;
 linenum = 1;
 printf("\t\t请从键盘录入文本(输入时回车换行,输入结束后在新的一行输入#结束录入)\n\t\t");
 while((ch = getchar()) !='#')
 {
   i = 0;
   info->text[i] = ch;
   i++;
   while((ch = getchar()) != '\n')      //从文件中读到一行字符到线性表中
   {
    
    info->text[i] = ch;
    i++;
   
   }
 printf("\t\t"); 
 info->text[i] = '\0';
 info->num = linenum++;
 info->next = (struct line*)malloc(sizeof(struct line));
 if (!info->next)
 {
  printf("\n\t\t内存不足");
  getchar();
  exit(0);
 }
 info->prior = temp;
 temp = info;
 info = info->next;
  }
  temp->next = NULL;
  last = temp;
  free(info);
  start->prior = NULL;
 
 
}
 
//文件保存
void save()
{
    system("cls");
 FILE *fp;
    line *info=start;
 int i=0;
    char name[20];
 printf("\n请输入保存地址(例如: c:\\a.txt):");
 scanf("%s",name);
  while ((fp=fopen(name,"w+"))==NULL)
  {
   printf("文件不存在,请重新输入文件名:");
   scanf("%s",name);
  }
 while(info)
 {  
        while(info->text[i]!='\n'
  {fprintf(fp,"%c",info->text[i]);
   i++;
  }
  info = info->next;
  i = 0;
 }
     
        fclose(fp);
  printf("\n文件保存成功\n");
 
}
 
 //查找字符串
void findstr(){
 
 PrintWord();
 char str[MAX];
 getchar();
 printf("\t\t 输入想要查找的字符串:");
 gets(str);
 printf("\t\t|>>________________________________________________<<|\n");
   struct line *info;
 int i = 0, find_len, found = 0, position;
 char substring[MAX];
 info = start;
 int find_num = 0;             //匹配到的次数
 find_len = strlen(str);
 while (info)   //查询
 {
  
  i = 0;  //行间循环
  while (i <= (strlen(info->text) - find_len))  //行内查找循环
  { int k=0;
   
   for(int j=i;j<i+find_len;j++)   // 行内的字符串从第一个开始按定长find_len赋给substring
   {
    substring[k] = info->text[j];
    k++;
   }
   if (strcmp(substring,str) == 0)
   {
    find_num++;
   
    printf("\t\t|第%d次出现在:%d行%d列\n",find_num,info->num,(i+1+1)/2);
    found = 1;
   }
    i++;
  }
  info = info->next;
 }
 if (found)  //查找成功
  printf("\t\t|\t\t该内容出现的总次数为%d\n",find_num);
 else   //查找不成功
  printf("\t\t该内容不存在\n");
 printf("\t\t|>>________________________________________________<<|\n");
 
}
 
//删除一行
void delete1(int line_num)
{
 struct line * info, *p;
 info = start;
 while ((info->num < line_num) && info)  //寻找要删除的行
  info = info->next;
 if (info == NULL)
  printf("该行不存在");
 else
 {
  p = info->next;     //指向要删除的行后面一行
  if (start == info) //如果删除的是第一行
  {
   start = info->next;
   if (start)  //如果删除后,不为空
    start->prior = NULL;
   else  //删除后为空
    last = NULL;
  }
  else
  {
   info->prior->next = info->next;  //指定行的上一行指向指定行的下一行
   if (info != last) //如果不是最后一行
    info->next->prior = info->prior;  //修改其下一行的指向头的指针
   else  //如果是最后一行,修改尾指针
    last = info->prior;
  }
  free(info);
  while (p) //被删除行之后的行号减一
  {
   p->num = p->num - 1;
   p = p->next;
  }
 
 }
 
}
 
//删除莫一行,莫列,定长的内容
void delete2(int line_num,int position,int lenth)
{
 
 struct line *info=start;
 char rest_str[MAX];
 if(line_num == 1)
 info = start;
 else
 for(int i=1;i<line_num;i++)       //让info指向删除内容所在行
 info = info->next;     
 if (info == NULL)
  printf("该行没有字符!n");
 else
 {
  if (strlen(info->text) <= (position + lenth))  //本行的字符长度<=待删除的列号+删除长度,直接在当前位置插入'\0'
   info->text[position] = '\0';
  else
  { int i;
   for(i = position-1;info->text[i+lenth]!='\0';i++)
   info->text[i]=info->text[i+lenth];
   info->text[i]='\0';
  }
 }
}
 
 
// 插入一行文字
void insert1()
{
 int linenum;
 printf("\t\t输入插入位置的行号:");
 scanf("%d", &linenum);
 struct line * info, * q, * p;
 p = start;
 q = NULL;
 
 while (p && p->num != linenum)              
 {
  q = p;    //插入行前面一行
  p = p->next;    //插入行后面一行
 }
 
 if (p == NULL && (q->num + 1) != linenum) //指定行不存在,不能插入
 {
  printf("\t\t输入的行号不存在");
 }
 
 else // 指定行存在,进行插入
 {
  info = (struct line *)malloc(sizeof(struct line));
  printf("\t\t输入要插入的字符串:");
  scanf("%s", info->text);
  info->num = linenum;
  if (linenum == 1)       //插入在第一行
  {
   info->next = p;
   p->prior = info;
   info->prior = NULL;
   start = info;
  }
 
  else if (q->num != linenum)  //插入在最后一行
  {
   q->next = info;
   info->next = p;
   info->prior = q;
  }
 
  else     //插入在其他行
  {
   q->next = info;
   info->next = p;
   p->prior = info;
   info->prior = q;
  }
 
  while (p)   //如果不是插入在最后一行,插入行后面的行号都加1
  {
   p->num = p->num + 1;
   p = p->next;
  }
 
 }
 
}
 
//插入文字到文本莫一行莫一列
void insert2(char str[], int linenum, int position)
{
 
 struct line * info;
 int len, i;
 int lenth;
 char rest_str[MAX],kongge[2] = { " " };
 info = start;
 while (info && info->num != linenum)   //查询要插入的行
 {
  info = info->next;
 }
 if (info == NULL)
  printf("不存在该行!\n");
 else if (position < 0)
  printf("不存在该列!\n");
 else    //如果行和列都存在,则进行插入
 {
  lenth = strlen(info->text);
  if (lenth < position) //插入列大于本行文件列数
  {
   len = position - lenth - 1;
   for (i = 0; i < len; i++)
   strcat(info->text, kongge);   //将空余的部分插入空格符
   strcat(info->text, str);    //插入字符到列的未尾
  }
 
  else   //插入列在本行文字的中间
  {
   strcpy(rest_str, &info->text[position - 1]);
   strcpy(&info->text[position - 1], str);
   strcat(info->text, rest_str);
  }
 }
}
 
//替换
void replace()
{
 PrintWord();
 char str[MAX];
 printf("\t\t输入想要替换的字符串:\t\t");
 scanf("%s",&str);
 char replace[MAX];
 printf("\t\t替换为:");
 scanf("%s",&replace);
   struct line *info;
 int i = 0, find_len, found = 0, position;
 char bijiao[MAX];
 info = start;
 int find_num = 0;             //匹配到的次数
 find_len = strlen(str);
 while (info)   //查询
 {
  
  i = 0;  //行间循环
  while (i <= (strlen(info->text) - find_len))  //行内查找循环
  { int k=0;
   
   for(int j=i;j<i+find_len;j++)   // 行内的字符串从第一个开始按定长find_len赋给substring
   {
    bijiao[k] = info->text[j];
    k++;
   }
   if (strcmp(bijiao,str) == 0)
   {
    find_num++;
    delete2(info->num,i+1,find_len);
    insert2(replace,info->num,i+1);
    found = 1;
   }
    i++;
  }
  info = info->next;
 }
 if (found)  //查找成功
  printf("\t\t该内容替换的总次数为%d\n",find_num);
 else   //查找不成功
  printf("\t\t该内容不存在\n");
 printf("\t\t经过替换后的内容为:\n");
 PrintWord();
 
 
 }
 
//文件录入方式菜单
void menu1()
{
 printf("\t\t|请选择录入方式    1:从键盘输入     2:从文件录入   |\n\t\t");
 int i;
 scanf("%d",&i);
 getchar();
  if(i>2||i<1)   
 {  
  printf("\t\t对不起,请输入正确的功能序号!\n");
 }
 switch(i)
 {
  case 1:
   scanf_load();
   system("cls");
   break;
  case 2:
   file_load();
   system("cls");
   break;    
  }
}
 
//移动菜单
void menu_move()
{
 
 int choice;
 printf("\n\t\t|_____________________移动操作_______________________|\n");
 printf("\n\t\t|----->1.    向下移动一行                <-----------|\n");
 printf("\t\t|----->2.    向上移动一行                <-----------|\n");
 printf("\t\t|----->3.    向右移动一列                <-----------|\n");
 printf("\t\t|----->4.    向左移动一列                <-----------|\n");
 printf("\t\t|----->5.    返回上级菜单                <-----------|\n");
 printf("\t\t请选择");
 scanf("%d",&choice);
 int line_num,number;
 char str[2];
 switch (choice)
   {
   case 1:   // 向下移动一行
    
    printf("\t\t输人要移动的字符串所在行号:");
    scanf("%d", &line_num);
    struct line *info,*p;                    //新建一行空行
    info = (struct line *)malloc(sizeof(struct line));
    info->text[0] = ' ';
    info->text[1] = '\0';
    info->num = line_num;
    if (line_num == 1)    //插入在首行
    {
     info->next = start;
     start->prior = info;
     start = info;
     start->prior = NULL;
     p=start->next;
    }
    else  //插入在其他行
          {
          p=start;
       while (p->num != line_num)
     p = p->next;                    //令p指向插入行
    info->next=p;
    info->prior=p->prior;
    p->prior->next=info;
    p->prior = info;}
    while (p)   //插入行后面的行号都加1
     {
     p->num = p->num + 1;
     p = p->next;
     }
    break;
   case 2:   //向上移动一行
    printf("\t\t输入要移动的字符串所在行号:");
    scanf("%d",&line_num);
    delete1(line_num-1);
    break;
   case 3:   //向右移动一列
    printf("\t\t输人要移动的字符串所在行号:");
    scanf("%d", &line_num);
    printf("\t\t输入要移动的字符串所在列号:");
    scanf("%d", &number);
    str[0] = ' ';
    str[1] = '\0';
    insert2(str, line_num, number);
    break;
   case 4:   //向左移动
    printf("\t\t输入要移动的字符串所在行号:");
    scanf("%d", &line_num);
    printf("\t\t输入要移动的字符串所在列号:");
    scanf("%d", &number);
    if (number <= 0)
     printf("\t\t该列不存在");
    else
     delete2(line_num, number - 2, 1);
    break;
   case 5:   //退出移动
    break;
 
}
 
}
 
//文本内容处理菜单
void menu2()
 char str1[20];
 char str2[20];
 int a;
do
{
 HeadWord();
 printf_time();
printf("\n\t\t ____________________________________________________\n");
printf("\t\t|           文章内容处理菜单                         |\n");
printf("\t\t|____________________________________________________|\n");
printf("\t\t|---->  1、查找文章中的字符或者字符串                |\n");
printf("\t\t|---->  2、删除文章中的字符或者字符串                |\n");
printf("\t\t|---->  3、向文章中插入字符或者字符串                |\n");
printf("\t\t|---->  4、移动文章字符或字符串                      |\n");
printf("\t\t|---->  5、替换文章字符或字符串                      |\n");
printf("\t\t|---->  6、返回主菜单                                |\n");
printf("\t\t|---->  7、直接退出系统                              |\n");
printf("\t\t|____________________________________________________|\n");
printf("\t\t    请选择:");
 scanf("%d",&a);
 switch(a)
 {
  case 1:  
          system("cls");
         HeadWord();
           findstr();
      printf("\t\t按回车键继续·····");
    getchar();
       getchar();
    system("cls");
       break;
    case 2:
          system("cls");
          HeadWord();
          printf("\t\t|    1:删除一行文字    2:删除莫一行,莫列,定长的内容|\n\t\t");
          int delete_choice;
             scanf("%d",&delete_choice);
             getchar();
             if(delete_choice == 1)
            {
       int linenum;
       printf("\t\t当前文本为:\n");
       PrintWord();
                printf("\t\t请输入你删除行的行号:");
          scanf("%d",&linenum);
       getchar();
                delete1(linenum);
   }
             else if(delete_choice == 2)
   {
       int linenum, position,lenth;  //行,列,删除长度
       printf("\t\t当前文本为:\n");
       PrintWord();
          printf("\t\t请输入要删除内容所在行,列,删除内容字节长度,中间用空格隔开\n");
       printf("\t\t--->注意:汉字占两个字节\n\t\t");
       scanf("%d %d %d",&linenum,&position,&lenth);
       position = (position*2)-1;
       getchar();
       delete2(linenum,position,lenth);
   }
            printf("\t\t删除后的文章为:\n");
            PrintWord();
      printf("\t\t按回车键继续·····");
   getchar();
   getchar();
   system("cls");
      break;
      case 3:
           
         system("cls");
         HeadWord();
            printf("\t\t|   1:插入一行文字      2:插入文字到文本到一行的中间|\n\t\t");
            int insert_choice;
            scanf("%d",&insert_choice);
            if(insert_choice == 1)
            {
            printf("\t\t当前文本为:\n");
   PrintWord();
   insert1();}
            else
           {
            printf("\t\t当前文本为:\n");
   PrintWord();
      char str[MAX]; int linenum; int position;
      printf("\t\t输入插入位置一行号:");
   scanf("%d", &linenum);
   printf("\t\t输入插入位置-列号:");
   scanf("%d", &position);
   position = (position*2)-1;
   printf("\t\t要插入的字符串:");
   scanf("%s", str);
   insert2(str,linenum,position);
     }
           
            printf("\t\t插入字符或字符串后文章为:\n");
            PrintWord();
      printf("\t\t按回车键继续·····");
   getchar();
   getchar();
   system("cls");
      break;
case 4:
      system("cls");
      HeadWord();
   printf_time();
      menu_move();
      printf("\t\t移动后文本内容为:\n");
   PrintWord();
      printf("\t\t按回车键继续·····");
   getchar();
   getchar();
   system("cls");
      break;
case 5:
    
      system("cls");
      HeadWord();
      printf_time();
      replace();
      printf("\t\t按回车键继续·····");
   getchar();
   getchar();
   system("cls");
         break;
}
if(a==6) 
{
 system("cls");
 break;
}
if(a==7)  exit(0);   
}while(1);       
}
 
//主菜单
 
void Mainmenu()
{
 printf("\n\n\n\n\n\n\n\n\n\t\t\tWelcom to use our TXT edition system!\n");
 printf("\n\n\t\t\t   欢迎您使用简易文本编辑器!\n");
 printf("\n\n\n\n\n\n\n\n\npress Enter to continue...");
 getchar();
 system("cls");
 int t;
 do{
 HeadWord();
 printf_time();
 printf("\n");
 printf("\t\t ____________________________________________________\n");
 printf("\t\t|                 主菜单                             |\n");
 printf("\t\t|                                                    |\n");
 printf("\t\t|---->  1、输入文章内容                              |\n");
 printf("\t\t|---->  2、进入文章内容处理菜单                      |\n");
 printf("\t\t|---->  3、显示当前文章内容                          |\n");
 printf("\t\t|---->  4、保存文本                                  |\n");
 printf("\t\t|---->  5、退出文本编辑器                            |\n");
 printf("\t\t|                                                    |\n");
 printf("\t\t|    注:第一次运行本程序时请选择功能1               |\n");
 printf("\t\t|____________________________________________________|\n");
 printf("  \t\t  请选择:");
 scanf("%d",&t);
 if(t>5||t<1)
 {  
  printf("对不起,无此功能,请输入正确的功能序号!\n");
 }
 else
 switch(t)
 
     case 1: 
       system("cls");
       HeadWord();
       menu1();
    printf("\t\t按回车键继续·····");
    getchar();
    getchar();
    system("cls");
             break;
     case 2: 
       system("cls");
       menu2();
    break;
  case 3:
       system("cls");
       HeadWord();
    printf_time();
    printf("\n\t\t ____________________文章内容为______________________\n");
             PrintWord();
    printf("\n");
    printf("\t\t按回车键继续·····");
    getchar();
    getchar();
    system("cls");
    break;
  case 4:
    HeadWord();
       save();
       break;
    
 
 if(t==5) break;
 }while(1);
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/Lee0818/article/details/98106316