特殊的线性表-串及其运算

本章简介

 串(又称字符串)是一种特殊的线性表,它的每个结点仅由一个字符组成。
 在早期的程序设计语言中,串仅在输入或输出中以直接量的形式出现,并不参与运算。随着计算机的发展,串在文字编辑、词法扫描、符号处理以及定理证明等许多领域得到越来越广泛的应用。在高级语言中开始引入了串变量的概念,如同整型、实型变量一样,串变量也可以参加各种运算。
 本章将讨论串的有关概念,存储方法和串的基本运算及其实现。

串的基本概念

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值