字串.docx
- 文档编号:6163586
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:13
- 大小:33.82KB
字串.docx
《字串.docx》由会员分享,可在线阅读,更多相关《字串.docx(13页珍藏版)》请在冰豆网上搜索。
字串
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)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 字串