串(又称字符串)是一种特殊的线性表,它的每个结点仅由一个字符组成。
在早期的程序设计语言中,串仅在输入或输出中以直接量的形式出现,并不参与运算。随着计算机的发展,串在文字编辑、词法扫描、符号处理以及定理证明等许多领域得到越来越广泛的应用。在高级语言中开始引入了串变量的概念,如同整型、实型变量一样,串变量也可以参加各种运算。
本章将讨论串的有关概念,存储方法和串的基本运算及其实现。
串的基本概念
1、串
串(String)是零个或多个字符组成的有限序列。一般记为
S="a1a2……an"
其中
①S是串名
②双引号括起的字符序列是串值;
将串值括起来的双引号本身不属于串,它的作用是避免串与常数或与标识符混淆。
【例】"123"是数字字符串,它不同于整常数123
【例】"xl"是长度为2的字符串,而xl通常表示一个标识符。
③ai(1≤i≤n)可以是字母、数字或其它字符;
④串中所包含的字符个数称为该串的长度。
2、空串和空白串
长度为零的串称为空串(Empty String),它不包含任何字符。
仅由一个或多个空格组成的串称为空白串(Blank String)。
注意:
空串和空白串的不同。
【例】″ ″和″″分别表示长度为1的空白串和长度为0的空串。
3、子串和主串
串中任意个连续字符组成的子序列称为该串的子串。包含子串的串相应地称为主串。
通常将子串在主串中首次出现时,该子串首字符对应的主串中的序号定义为子串在主串中的序号(或位置)。
【例】设A和B分别为
A="This is a string"
B="is"
则B是A的子串,B在A中出现了两次。其中首次出现对应的主串位置是3。因此称B在A中的序号(或位置)是3。
注意:
①空串是任意串的子串
②任意串是其自身的子串。
4、串变量和串常量
通常在程序中使用的串可分为:串变量和串常量。
(1)串变量
串变量和其它类型的变量一样,其取值是可以改变的。
(2)串常量
串常量和整常数、实常数一样,在程序中只能被引用但不能改变其值。即只能读不能写。
①串常量由直接量来表示的:
【例】Error("overflow")中"overflow"是直接量。
②串常量命名
有的语言允许对串常量命名,以使程序易读、易写。
【例】C++中,可定义串常量path
const char path[]="dir/bin/appl";
串的基本运算
对于串的基本运算,很多高级语言均提供了相应的运算符或标准的库函数来实现。
为叙述方便,先定义几个相关的变量:
char s1[20]="dir/bin/appl",s2[20]="file.asm",s3[30],*p;
int result;
下面以C语言中串运算介绍串的基本运算
1、求串长
int strlen(char *s);//求串s的长度
【例】printf("%d",strlen(s1)); //输出s1的串长12
2、串复制
char *strcpy(char *to,*from);//将from串复制到to串中,并返回to开始处指针
【例】strcpy(s3,s1); //s3="dir/bin/appl",s1串不变
3、联接
char *strcat(char *to,char *from);//将from串复制到to串的末尾,
//并返回to串开始处的指针
【例】strcat(s3,"/"); //s3="dir/bin/appl/"
strcat(s3,s2); //s3="dir/bin/appl/file.asm"
4、串比较
int strcmp(char *s1,char *s2);//比较s1和s2的大小,
//当s1<s2、s1>s2和s1=s2时,分别返回小于0、大于0和等于0的值
【例】result=strcmp("baker","Baker"); //result>0
result=strcmp("12","12"); //result=0
result=strcmp("Joe","joseph") //result<0
5、字符定位
char *strchr(char *s,char c);//找c在字符串s中第一次出现的位置,
//若找到,则返回该位置,否则返回NULL
【例】p=strchr(s2,'.'); //p指向"file"之后的位置
if(p) strcpy(p,".cpp"); //s2="file.cpp"
注意:
①上述操作是最基本的,其中后 4个操作还有变种形式:strncpy,strncath和strnchr。
②其它的串操作见C的<string.h>。在不同的高级语言中,对串运算的种类及符号都不尽相同
③其余的串操作一般可由这些基本操作组合而成
【例】求子串的操作可如下实现:
void substr(char *sub,char *s,int pos,int len){
//s和sub是字符数组,用sub返回串s的第pos个字符起长度为len的子串
//其中0<=pos<=strlen(s)-1,且数组sub至少可容纳len+1个字符。
if (pos<0||pos>strlen(s)-1||len<0)
Error("parameter error!");
strncpy(sub,&s[pos],len);//从s[pos]起复制至多len个字符到sub
}//substr
转载自:http://student.zjzk.cn/course_ware/data_structure/web/chuan/chuan4.1.1.htm
参考:http://student.zjzk.cn/course_ware/data_structure/web/chuan/chuan4.2.3.1.htm