8字符串
字符串
简称串,是有穷字符序列。字符个数称串长,空串(null string)的长度等于0。
串常量:用一对双引号括起来的字符序列
串变量:一维字符数组
应用较广:
1.文本编辑
2.对C源程序进行编辑、编译
3.处理用户输入数据、输入命令
4.模式匹配、模式识别
串运算:插入、删除、查找、替换(有点像线性表),也可看成“特殊的表结构”
串与线性表的差别:
串元素是单个字符。
表元素是有独立含义的结点。
C语言的头文件string.h提供的常用串处理库函数
1. strlen(串) 求串长(字符个数)
2. strcat(串1,串2) 串连接(将串2内容接在串1后面)
3. strcmp(串1,串2) 串比较(按字典序)
若 串1=串2,返回0
若 串1<串2,返回负数
若 串1>串2,返回正数
4. strcpy(串1,串2) 串复制(将串2内容复制到串1串)
5. strchr(串,字符c) 串查找(在串中查找字符c第一次出现的位置)
若找到,返回这个位置的地址
否则,返回空地址NULL
6. strstr(串1,串2) 子串匹配(也称模式匹配)
在串1查找内容与串2相同的子串第一个出现的位置
若找到,返回这个位置的地址
否则,返回空地址NULL
存储方法
多种存储方式:如顺序存储,或链式存储
选择存储方式,既要考虑串的大小,又考虑对串进行何种运算
(1)顺序存储
比较适合于长度较小,或只作简单运算的串
(2)链式存储
比较适合于串很大,而且插入、删除频繁
存储结点的优缺点:
每个字符占一个结点——浪费空间
以行为单位存储(便于修改)
示例
[1]定长(fixture)结点
选定合适的大小m(比如m=80,或m=1024)作为结点的长度,每个结点可存储放的有效字符数不超过m,每行占1到多个结点。
结点类型定义为:
#define m 80
typedef struct snode1
{ char line[m]; //用于存放字符的值域
int count ; //本结点存放的字符数
struct snode1 *next; //链域
} fixturenode,*fdptr; //定义结点类型名和指针类型名
注意:结点内部:顺序存储;结点之间:链式存储
[2]变长(indefinite)结点
每产生一个新行时,调用malloc函数预先为其分配长度为m的存储空间。当本行超长时,调用realloc函数,为其长度加一个增量n。
结点类型定义为:
#define m 80 //每行最小长度
#define n 40 //重新分配时的长度增量
typedef struct snode2
{ char *line; //指向本节点存放字符的区域
int linelong ; //本行当前分配的空间长度
int count ; //本结点存放的字符数
struct snode2 *next; //链域
} infixturenode,*infdptr; //定义结点类型名和指针类型名