串的基本概念
字符串:應用在非數值處理、事務處理等領域。
計算機的硬件:主要是反映數值計算的要求。
字符串的處理比具體數值處理複雜。
串(字符串):是零個或多個字符組成的有限序列。記作: S=“a1a2a3…”,其中S是串名,ai(1≦i≦n)是 單個字符,可以是字母、數字或其它字符。
串值:雙引號括起來的字符序列,引號不屬於串的內容。
串長:串中所包含的字符個數。
空串(空的字符串):長度爲零的串,它不包含任何字符。
空格串(空白串):構成串的所有字符都是空格。
注意:空串和空白串的不同,空格串是有內容有長度的,而且可以不止一個空格;例如“ ”和“”分別表示長度爲3的空白串和長度爲0的空串。
子串(substring):串中任意個連續字符組成的子序列稱爲該串的子串,包含子串的串相應地稱爲主串。
子串的序號:子串在主串中首次出現時,該子串的首字符對應在主串中的序號,稱爲子串在主串中的序號(或位置)。
例如,A=“This is a string”,B=“is”,
B是A的子串,A爲主串。
B在A中的序號爲3 。
特別地,空串是任意串的子串,任意串是其自身的子串。
串的基本操作
對於串的基本操作,許多高級語言均提供了相應的運算或標準庫函數來實現。下面先介紹幾種在C語言中常用的串運算。
定義下列幾個變量:
char s1[20]=“dirtreeformat”;
char s2[20]=“file.mem”;
char s3[30], *p;
int result;
(1)求串長(length)
int strlen(char *s); //求串的長度
例如:printf(“%d”,strlen(s1)); 輸出13
(2)串複製(copy)
char *strcpy(char *to,char *from);
該函數將串from複製到串to中,並且返回一個指向串to的開始處的指針。
例如:strcpy(s3,s1); //s3=“dirtreeformat”
(3)聯接(concatenation)
char * strcat(char *to,char *from)
該函數將串from複製到串to的末尾,並且返回一個指向串to的開始處的指針。
例如:strcat(s3,”/”);
strcat(s3,s2); //s3=“dirtreeformat/file.mem”
(4)串比較(compare)
int strcmp(char *s1,char *s2);
該函數比較串s1和串s2的大小,當返回值<0,=0或>0時分別表示s1<s2、s1=s2或s1>s2
例如:result=strcmp(“baker”,”Baker”) result>0
result=strcmp(“12”,”12”); result=0
result=strcmp(“Joe”,”Joseph”); result<0
(5)字符定位(index)
int strchr(char *s, char c);
該函數是找c在字符串中第一次出現的位置,若找到則返回該位置,否則返回NULL。
串的存儲表示和實現
串是一種特殊的線性表,其存儲表示和線性表類似,但又不完全相同。串在計算機中有3種表示方式:
◆ 定長(靜態)順序存儲表示:將串定義成字符數組,利用串名可以直接訪問串值。用這種表示方式,串的存儲空間在編譯時確定,其大小不能改變。
◆ 堆分配(動態順序)存儲方式:仍然用一組地址連續的存儲單元來依次存儲串中的字符序列,但串的存儲空間是在程序運行時根據串的實際長度動態分配的。
◆ 塊鏈存儲方式:是一種鏈式存儲結構表示。
串的定長順序存儲表示
這種存儲結構又稱爲串的順序存儲結構。所謂定長順序存儲結構,是直接使用定長的字符數組來定義,數組的上界預先確定。
定長順序存儲結構定義爲:
#define MAX_STRLEN 256
typedef struct
{ char str[MAX_STRLEN] ;
int length;
} StringType ;
1 串的聯結操作
Status StrConcat ( StringType *s, StringType t)
/* 將串t聯結到串s之後,結果仍然保存在s中 */
{ int i, j ;
if ((s->length +t->length)>MAX_STRLEN)
return ERROR ; /* 聯結後長度超出範圍 */
for (i=0 ; i<t->length ; i++)
s-> str[s->length+i]=t->str[i] ; /* 串t聯結到串s之後 */
s->length= s->length+ t->length ; /* 修改聯結後的串長度 */
return OK ;
}
1 串的聯結操作
Status StrConcat(HString *T, HString s1, HString s2)
/* 用T返回由s1和s2聯結而成的串 */
{ int k, j , t_len ;
if (T.ch) free(T); /* 釋放舊空間 */
T-> length =s1.length+s2.length ;
if (( T->ch=(char *)malloc(sizeof((char)*t_len))==NULL)
{ printf(“系統空間不夠,申請空間失敗 !\n”) ;
return ERROR ; }
for ( j=0 ; j<s1.length; j++ )
T->ch[j]=s1.ch[j] ; /* 將串s1複製到串T中 */
for ( j=s1.length, k=0 ; k<s2.length; k++, j++)
T->ch[j]=s2.ch[k] ; /* 將串s2複製到串T中 */
return OK ;
}
串的模式匹配算法
模式匹配(模範匹配):子串在主串中的定位稱爲模式匹配或串匹配(字符串匹配) 。模式匹配成功是指在主串S中能夠找到模式串T,否則,稱模式串T在主串S中不存在。
模式匹配的應用在非常廣泛。例如,在搜索引擎和文本編輯程序中,我們經常要查找某一特定單詞在文本中出現的位置。顯然,解此問題的有效算法能極大地提高文本編輯程序的響應性能。
模式匹配是一個較爲複雜的串操作過程。迄今爲止,人們對串的模式匹配提出了許多思想和效率各不相同的計算機算法。