串(string)(或字符串):是由零个或多个字符组成的有限序列,一般记为s=‘a1a1a3…an’(n>=0)其中,s是串的名,用单引号括起来的字符序列是串的值;ai(1<=i<=n)可以是字母,数字或者其他字符;串中字符数目n称为串的长度.
-
串的基本概念
空串:零个字符的串称为空串
空格串:由一个或多个空格组成的串’ '它的长度为串中空格字符的个数
子串:串中任意个连续的字符组成的子序列称为该串的子串
主串:包含子串的串相应地称为主串
主串与子串:任意串都是自身的子串,子串在主串的位置指的是该子串的第一个字符在主串中的位置
练习:
1.若串S=“abcdefgh”,其中子串的数目是37.
解析:‘a’:8
‘b’:7
…8+7+6+5+4+3+2+1+1=37
推广到一般,S="a1,a2,a3…an"其子串数目为(n+1)n/2+1.
2.设S为一个长度为n的字符串,其中的字符各不相同,则S中的互异的非平凡子串(非空且不同于S本身)的个数为(n+1)n/2-1. -
串的抽象数据类型定义
ADT String{
数据对象:D={ai|ai∈CharacterSet,i=1,2,...,n;n>=0}
数据关系:S={<ai-1,ai>|ai-1∈D,i=2,...,n}
基本操作:
StrAssign(&T,chars)
SubString(&Sub,S,pos,len)
StrCopy(&T,S)
StrEmpty(S)
StrCompare(S,T)
Contact(&T,S1,S2)
StrLength(S)
Index(S,T,pos)
Replace(&S,T,V)
StrInsert(&S,pos,T)
StrDelete(&S,pos,len)
}ADT String
串与一般的线性表的区别:
- 串的数据元素约束为字符集.
- 串的基本操作通常针对串的整体或串的一个部分(子串)进行.
Q:为何要单独讨论“串”类型?
A:串操作比其他数据类型更复杂(如拷贝,连接操作)
程序设计中,处理对象很多都是串类型.
3.串的表示方法
顺序存储:①定长顺序存储表示(静态数组结构)②堆分配存储表示(动态数组结构)
链式存储:链串 块链
#include<stdio.h>
#include<string.h>
int main(){
int i,d;
char s[27]="abcdefghijklmnopqrstuvwxyz";
for(i=0;i<strlen(s);i++){
d=i+1;
printf("%-26.*s\n",d,s);
}
}
运行截图:
strcat(串1,串2) 串连接(将串2内容接在串1后面)
#include<stdio.h>
void main(){
char s1[20]="I";
char s2[20]="love";
char s3[50]="Beijing Normal University";
strcat(s1,s2);
printf("s1=%s",s1);
strcat(s1,s3);
printf("s1=%s",s1);
}
strncat(串1,串2,n) 串连接(将串2内容最左边n个字符接在串1后面)
#include<stdio.h>
void main(){
char s1[20]="I";
char s2[20]="love";
char s3[50]="Beijing Normal University";
strcat(s1,s2);
printf("s1=%s",s1);
strcat(s1,s3,7);
printf("s1=%s",s1);
}
strcmp(串1,串2) 串比较(按字典顺序)串1=串2,返回0;串1>串2,返回负值;串1<串2,返回正数.
#include<stdio.h>
void main(){
int c1,c2,c3;
char s1[20]="abc1234";
char s2[20]="abz1";
char s3[20]="abc1234";
c1=strcmp(s1,s2);
printf("c1=%d\n",c1);
c2=strcmp(s2,s1);
printf("c2=%d\n",c2);
c3=strcmp(s1,s3);
printf("c3=%d\n",c3);
}
strncmp(串1,串2,n) 串比较 把串2 最左边的n个字符与串1比较.
#include<stdio.h>
void main(){
int c1,c2,c3;
char s1[20]="abc1234";
char s2[20]="abz1";
c1=strcmp(s1,s2);
printf("c1=%d\n",c1);
c2=strcmp(s2,s1,3);
printf("c2=%d\n",c2);
}
strcpy(串1,串2) 串拷贝(将串2复制到串1)
#include<stdio.h>
void main(){
char s1[20]="I";
char s2[20]="love";
printf("s1=%s,s2=%s\n",s1,s2);
strcpy(s1,s2);
printf("s1=%s,s2=%s\n",s1,s2);
}
strncpy(串1,串2,n) 串拷贝(将串2最左边n个字符复制到串1)
#include<stdio.h>
void main(){
char s1[20]="I";
char s2[30]="Beijing Normal University";
printf("s1=%s,s2=%s\n",s1,s2);
strcpy(s1,s2,7);
printf("s1=%s,s2=%s\n",s1,s2);
}
strchr(串,字符c) 串查找(在串中查找字符c第一次出现的位置) 若找到,则返回这个位置的地址;否则,返回空地址NULL.
strstr(串1,串2) 子串匹配(也称模式匹配)在串1查找内容与串2相同的子串第一个出现的位置 若找到,则返回这个位置的地址;否则,返回空地址NULL.
#include<stdio.h>
void main(){
char s1[30]="Beijing Normal University";
if(strstr(s1,"University")==NULL){
printf("%s名称不包含University",s1);
}else{
printf("%s包含University",s1);
}
}
4.C语言的字符处理函数
用C语言处理字符时,要调用标准库函数
#include<ctype.h>
int isalnum(int ch);
int isalpha(int ch);
int isgraph(int ch);
int islower(int ch);
int isupper(int ch);
int isxdigit(int ch);
...
5.定长顺序存储表示
串的基本运算及其实现
- 串的输入和输出
- 串的长度
- 判断串的此昂等
- 串连接
-取子串