字串.docx

上传人:b****5 文档编号:6163586 上传时间:2023-01-04 格式:DOCX 页数:13 大小:33.82KB
下载 相关 举报
字串.docx_第1页
第1页 / 共13页
字串.docx_第2页
第2页 / 共13页
字串.docx_第3页
第3页 / 共13页
字串.docx_第4页
第4页 / 共13页
字串.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

字串.docx

《字串.docx》由会员分享,可在线阅读,更多相关《字串.docx(13页珍藏版)》请在冰豆网上搜索。

字串.docx

字串

1.  串的定义

计算机上的非数值处理的对象基本上是字符串数据。

在较早的程序设计语言中,字符串是作为输入和输出的常量出现的。

随时着语言加工程序的发展,产生了字符串处理。

这样,字符串也就作为一种变量类型出现在越来越多的程序设计语言中,同时也产生了一系列字符串的操作。

字符串一般简称为串。

在汇编和语言的编译程序中,源程序和目标程序都是字符串数据。

在事务处理程序中,顾客的姓名和地址以及货物的名称、产地和规格等一般也是作为字符串处理的。

又如信息检索系统、文字编辑程序、问答系统、自然语言翻译系统以及音乐分析程序等等,都是以字符串数据作为处理对象的。

然而,现今我们使用的计算机的硬件结构主要是反映数值计算的需要的,因此,在处理字符中数据时比处理整数和浮点数要复杂得多。

而且,在不同类型的应用中,所处理的字符串具有不同的特点,要有效地实现字符串的处理,就必须根据具体情况使用合适的存储结构。

这一章,我们将讨论一些基本的串处理操作和几种不同的存储结构。

串中任意个边疆的字符组成的子序列称为该串的子串。

包含子串的串相应地称为主串。

通常称字符在序列中的诒为该字符在串中的位置。

子串在主串中的位置则以子串的第一个字符在主串中的位置来表示。

例如,假设a、b、c、d为如下的四个串

            a='BEI'                    ,  b='JING'

            c='BEIJING'              ,  d='BEIJING'

则它们的长度分别为3、4、7和8;并且a和b都是c的子串,a在c和d中的位置都是1,而b在c中的位置是4,在d中的位置则是5.

称两个串是相等的,当且仅当这两个串的值是相等的。

也就是说,只有当两个串的长度相等,并且各个对应位置的字符都相等时才相等。

例如上例中的串a、b、c和d彼此都不相等。

值得一提的是,串值必须用一对单引号括起来,但单引号本身不属于串,它的作用只是为了避免与变量名或数的常量混淆而已。

例如在程序设计语言中

    x='123'';

则表明x是一个串变量名,赋给它的值是字符序列123。

又如

        tsing='TSING'

中,tsing是一个串变量名,而字符序列TSING是其值。

在各种应用中,空格常常是串的字符集合中的一个元素,因而可以出现在其它字符中间。

由一个或多个空格组成的串''称为空格串(blankstring,请注意:

此处不是空串)。

它的长度为串中空格字符的个数。

为了清楚起见,以后我们用符号"0"来表示"空串"。

串的逻辑结构和线性表极为相似,区别仅在于串的数据对象约束为字符集。

然而,串的基本操作和线性表有很大差别。

在线性表的基本操作中,大多以"单个元素"作为操作对象,如:

在线性表中查找某个元素、求取某个元素、在某个位置上插入一个元素和删除一个元素等;而在串的基本操作中,通常以"串的整体"作为操作对象,如:

在串中查找某个子串、求取一个子串、在串的某个位置上插入一个子串以及删除一个子串等。

2串的抽象定义

串的抽象数据类型的定义如下:

  基本操作:

StrAssign(&T,chars)

  初始条件:

chars是字符串常量。

  操作结果:

生成一个其值等于chars的串T。

StrCopy(&T,S)

初始条件:

串S存在。

操作结果:

由串S复制得串T。

StrEmpty(S)

初始条件:

串S存在。

操作结果:

若S为空串,则返回TRUE,否则返回FALSE。

StrCompare(S,T)

初始条件:

串S和T存在。

操作结果:

若S>T,则返回值>0;若S=T,则返回值=0;若S

        StrLength(S)

初始条件:

串S存在。

操作结果:

返回S的元素个数,称为串的长度。

ClearSgring(&S)

初始条件:

串S存在。

操作结果:

将S清为空串。

Contact(&T,S1,S2)

初始条件:

串S1和S2存在。

操作结果:

用T返回由S1和S2联接而成的新串。

SubString(&Sub,S,pos,len)

初始条件:

串S存在,1≤pos≤StrLength(S)且0≤len≤StrLength(S)-pos+1.

操作结果:

用Sub返回串S的第pos个字符起长度为len的子串。

Index(S,T,pos)

初始条件:

串S和T存在,T是非空串,1≤pos≤StrLength(S).

操作结果:

若主串S中的存在和串T值相同的子串,则返回它在主串S中第pos个字符之后第一次出现的位置;否则函数值为0。

}

Replace(&S,T,V)

初始条件:

串s,T和v存在,T是非空串。

操作结果:

用v替换主串s中出现的所有与T相等的不重叠的子串。

Strlnsert(&S,pos,T)      

初始条件:

串S和T存在,l≤pos≤StrLength(S)+1。

操作结果:

在串S的第pos个字符之前插个串T.  

StrDelete(&S,pos,len)    :

初始条件:

串S存在,1≤pos≤StrLength(S)-len+1。

    

操作结果:

从串s中删除第pos个字符起长度为len的子串.

DestroyStrlng(&S)

初始条件:

串s存在。

    

操作结果:

串s被销毁。

}ADTString  

  

对于串的基本操作集可以有不同的定义方法,读者在使用高级程序设计语言中的串类型时,应以该语言的参考手册为准。

在上述抽象数据类型定义的13种操作中,串赋值StrAssign、串比较StrCompare、求串长StrLength、串联接Concat以及求子串SubStrin8等五种操作构成串类型的最小操作子集。

即:

这些操作不可能利用其他串操作来实现,反之,其他串操作(除串清除C1earString和串销毁DestroyString外)均可在这个最小操作子集上实现。

    .

    例如,可利用判等、求串长和求子串等操作实现定位函数Index(S,T,pos)。

算法的基本思想为:

在主串S中取从第i(i的初值为pos)个字符起、长度和串T相等的于串和

    串T比较,若相等,则求得函数值为i,否则i值增1直至串S中不存在和串T相等的子

    串为止。

如算法1所示。

    intlndex(StringS,StringT,intpos){    

    //T为非空串。

若主串s中第pos个字符之后存在与T相等的于串,

    //则返回第一个这样的子串在s中的位置,否则返回0    

    if(pos>0){  ’

    n=StrLength(S);  m=StrLength(T);  i=pos;    

    while(i<=n-m+1){

    SubString(sub,S,i,m);

    if(StrCompare(sub,T)!

=0)    ++i;

    elsereturni;  //返回子串在主串中的位置

    }//while

    }//if

return0;          //S中不存在与T相等的子串

}//Index

  算法1

3串操作应用举例

  文本编辑

    文本编辑程序是一个面向用户的系统服务程序,广泛用于源程序的输入和修改,甚至

用于报刊和书籍的编辑排版以及办公室的公文书信的起草和润色。

文本编辑的实质是修

改字符数据的形式或格式。

虽然各种文本编辑程序的功能强弱不同,但是其基本操作是

一致的,一般都包括串的查找,插入和删除等基本操作。

    为了编辑的方便,用户可以利用换页符和换行符把文本划分为若干页,每页有若干行

(当然,也可不分页而把文件直接划成若干行)。

我们可以把文本看成是一个字符串,称为

文本串。

页则是文本串的子串,行又是页的子串。

    比如有下列一段源程序

main(){

  float  a,b,max;

  scanf("%f,%f",&a,&b);

  ifa>bmax=a

  elsemax=b;

}

我们可以把此程序看成是一个文本串.输入到内存后如图所示.图中"/"为换行符.

    为了管理文本串的页和行,在进入文本编辑的时候,编辑程序先为文本串建立相应的

页表和行表,即建立各子串的存储映象。

页表的每一项给出了页号和该页的起始行号。

而行表的每一项则指示每一行的行号、起始地址和该行子串的长度。

假设图4.7所示文

本串只占一页,且起始行号为100,则该文本串的行表如图所示。

    文本编辑程序中设立页指针、行指针和字符指针,分别指示当前操作的页、行和字符。

如果在某行内插入或删除若干字符,则要修改行表中该行的长度。

若该行的长度超出了

分配给它的存储空间,则要为该行重新分配存储空间,同时还要修改该行的起始位置。

果要插入或删除一行,就要涉及行表的插入或删除。

若被删除的行是所在页的起始行,则

还要修改页表中相应页的起始行号(修改为下一行的行号)。

为了查找方便,行表是按行

号递增顺序存储的,因此,对行表进行的插入或删除运算需移动操作位置以后的全部表

项。

页表的维护与行表类似,在此不再赘述。

由于访问是以页表和行表作为索引的,所以

在作行和页的删除操作时,可以只对行表和页表作相应的修改,不必删除所涉及的字符。

这可以节省不少时间。

    

  

/*========================================*/

/*    输入字串且将之印出                    */

/*========================================*/

#include

voidmain()

{

  charstring[100];              /*字串阵列宣告    */

  charch;                      /*输入字元        */

  inti;

  for(i=0;i<100;i++)    /*清除字串阵列内容*/

      string[i]='';

  putchar('?

');                  /*列出提示输入讯息*/

  i=0;

  while((ch=getchar())!

='\n')  /*输入字元    */

  {

      string[i]=ch;            /*存入字串内      */

      i++;

  }

  for(i=0;i<100;i++)    /*印出字串内容    */

      putchar(string[i]);

  putchar('\n');                /*换行            */

}

/*========================================*/

/*    输入字串且将之印出                    */

/*========================================*/

#include

voidmain()

{

  charstring[100];              /*字串阵列宣告    */

  charch;                      /*输入字元        */

  inti;

  putchar('?

');                  /*列出提示输入讯息*/

  i=0;

  while((ch=getchar())!

='\n')  /*输入字元    */

  {

      string[i]=ch;            /*存入字串内      */

      i++;

  }

  string[i]='\0';              /*加结束字元      */

  for(i=0;string[i]!

='\0';i++)

      putchar(string[i]);        /*印出字串内容    */

  putchar('\n');                /*换行            */

}

/*========================================*/

/*    使用字元阵列来储存格式字串            */

/*========================================*/

voidmain()

{

  charformat[]={'T','h','e','','s','c','o',

                    'r','e','','i','s','','%',

                    'd','\n','\0'};

  intscore;                          /*成绩        */

  score=100;                        /*设定成绩内容*/

  printf("使用正常的格式化字符串\n");    /*印出结果    */

  printf("Thescoreis%d\n",score);

  printf("使用字符数组的格式化字符串\n");

  printf(format,score);

}

(插入影象16-5)

/*========================================*/

/*    输入字串且将之印出                    */

/*========================================*/

#include

voidmain()

{

  charstring[100];              /*字串阵列宣告      */

  charch;                      /*输入字元          */

  inti;

  putchar('?

');                  /*列出提示输入讯息  */

  i=1;                        /*从第二个元素开始  */

  while((ch=getchar())!

='\n')  /*输入字元    */

  {

      string[i]=ch;            /*存入字串内        */

      i++;

  }

  string[0]=i-1;            /*存入字串长度      */

  for(i=1;i<=string[0];i++)  /*印出字串内容*/

      putchar(string[i]);

  putchar('\n');                /*换行              */

}

/*----------------------------------------*/

/*  计算字串长度                            */

/*----------------------------------------*/

intstrlen(char*str)

{

  inti;

  for(i=0;str[i]!

='\0';i++);/*用回路计算长度*/

  returni;

}

/*----------------------------------------*/

/*  主程式:

读入字串後,印出字串长度        */

/*----------------------------------------*/

voidmain()

{

  charstring[100];                  /*字串阵列宣告  */

  intlen;                            /*字串长度      */

  printf("请输入字符串==>");

  gets(string);                      /*读取字串      */

  len=strlen(string);              /*计算字串长度  */

  printf("输入字符串长度是%d\n",len);

}

(插入影象16-7)

/*========================================*/

/*    字串拷贝                              */

/*========================================*/

/*----------------------------------------*/

/*  字串拷贝                                */

/*----------------------------------------*/

char*strcpy(char*str1,char*str2)

{

  inti;

  for(i=0;str2[i]!

='\0';i++)

      str1[i]=str2[i];          /*拷贝字串内容*/

  str1[i]='\0';                /*设定字串结束*/

  returnstr1;

}

/*----------------------------------------*/

/*  主程式:

读取字串後,将它做备份.        */

/*----------------------------------------*/

voidmain()

{

  charstring[100];              /*原始字串宣告*/

  charbackup[100];              /*备份字串宣告*/

  printf("请输入字符串==>");

  gets(string);                  /*读取字串    */

  strcpy(backup,string);        /*拷贝子字串  */

  printf("原始字符串%s\n",string);  /*印出原始字串*/

  printf("备份字符串%s\n",backup);  /*印出备份字串*/

}

/*========================================*/

/*    结合两字串                            */

/*========================================*/

/*----------------------------------------*/

/*  结合两字串                              */

/*----------------------------------------*/

char*strcat(char*str1,char*str2)

{

  inti,j;

  for(i=0;str1[i]!

='\0';i++);/*找字串str1结束*/

  for(j=0;str2[j]!

='\0';j++)  /*拷贝字串内容  */

      str1[i+j]=str2[j];

  str1[i+j]='\0';                  /*设定字串结束  */

  returnstr1;

}

/*----------------------------------------*/

/*  主程式:

输入二字串後,将之结合成一字串.*/

/*----------------------------------------*/

voidmain()

{

  charstring1[200];                  /*字串阵列1宣告*/

  charstring2[100];                  /*字串阵列2宣告*/

  printf("请输入字符串

(1)==>");

  gets(string1);                      /*读取字串1    */

  printf("请输入字符串

(2)==>");

  gets(string2);                      /*读取字串2    */

  strcat(string1,string2)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1