正文编辑程序是一个面向用户的系统服务程序,广泛用于源程序的输入和修改,甚至用于报刊和书籍的编辑排版以及办公室的公文书信的起草和润色等。正文编辑的实质是修改字符数据的形式或格式。无论是 Microsoft word 还是 WPS,其工作的基础原理都是正文编辑。虽然各种正文编辑程序的功能强弱不同,但其基本功能大致相同,一般都包括串的查找、插入、删除和修改等基本操作。

  为了编辑方便起见,用户可以通过换页符和换行符将正文划分为若干页和若干行(或直接划分为若干行)。在编辑程序中,则可将整个正文看成是一个"正文串","页"是正文串的子串,而行则是页的子串。

  假设有下列一段C的源程序
  main(){
   float a,b,max;
   scanf("%f,%f",&a,&b);
   if a>b max=a;
   else max=b;
  };
  我们将此源程序看成是一个正文串,输入内存后如图所示,图中"�L"为换行符。
  200
m
a
i
n
(
)
{
�L
f
l
o
a
t
a
,
b
,
m
a
x
;
�L
s
c
a
n
f
(
"
%
f
,
%
f
"
,
&
a
,
&
b
)
;
�L
i
f
a
>
b
m
a
x
=
a
;
�L
 
e
l
s
e
   
m
a
x
=
b
;
�L
}
;
�L
 
 
  正文编辑程序应用极其广泛,现有的编辑工具也很多,由于正文编辑中主要进行的是串操作,因此在此作为串的应用例子向读者简单介绍正文编辑的主要思想。但这里讨论的仅仅是进行正文编辑时内部的串操作,并不涉及目前常用的屏幕编辑中的图形操作。
 
    为了管理正文串中的页和行,在进入正文编辑时,编辑程序先为正文串建立相应的页表和行表,页表的每一项列出页号和该页的起始行号,行表的每一项则指示每一行的行号、起始地址和该行子串的长度。假设此例正文串只占一页,起始行号为100,则该正文串的行表如右所示。

  在正文编辑程序中设立页指针、行指针和字符指针,分别指示当前操作的页、行和字符。如果在某行内插入或删除若干字符,则要修改行表中该行的长度,若该行长度因插入而超出了原分配给它的存储空间,则要为该行重新分配存储空间,并修改该行的起始位置。例如,对上述源程序进行编辑后,其中的105行修改成

  if (a>b) max=a;
  108行修改成
  }
  修改后的行表如下所示。

行号
起始地址
长度
100
200
8
102
208
17
104
225
24
105
284
19
106
266
15
108
281
2
 
 
行号
起始地址
长度
100
200
8
102
208
17
104
225
24
105
249
17
106
266
15
108
281
3
 
    当插入或删除一行时必须同时对行表也进行插入和删除,若被删除的"行"是所在页的起始行,则还要修改页表中相应页的起始行号(应修改成下一行的行号)。为了查找方便,行表是按行号递增的顺序安排的,因此对行表进行插入或删除时需移动操作之后的全部表项。页表的维护与行表类似,在此不再赘述。由于对正文的访问是以页表和行表作为索引的,因此在删除一页或一行时,可以只对页表或行表作相应修改,不必删除所涉及的字符,这可以节省不少时间。     注意在正文编辑中,行表和页表与串值的存储是分开的。行表和页表反映了串值存储情况的扼要信息,相当是串值的一种查找索引,也称为串的存储映象。通过串的存储映象可以更方便地对串值进行大量的同类操作。