串
先來看看下面這幾句:
黃山落葉松葉落山黃,上海自來水來自海上,還有小嶽嶽春晚的那句:山西運煤車煤運西山。
諸如此類的句子很多人都聽過,他們有一個共同的特點:順着讀,倒着讀都一樣。他們也有一個共同的名字:迴文。
再看下面的這三組英文單詞,很有意思。
lover–over
friend–end
believe–lie
愛人中有結束,朋友中有完結,信任中有謊言。
如果我們把這些單詞看成串,那麼,我們就可以給出這些單詞一個新的稱呼了。左邊的叫主串,右邊的叫子串。
子串與主串:串中任意個數的連續字符組成的子序列,稱爲該串的字串,相應的,包含子串的串稱爲主串。
順便一提空格串:只包含空格的串。空格串不等於空串。
說了這麼多終於回到主題,串,什麼是串?下面這個?
(一直覺得串這個字很有意思,很形象。就好像一個籤子穿了兩塊肉?!)
咳咳~,扯遠了,回到正題。
字符串:串是由零個或多個字符組成的有限序列,又名叫字符串。
這裏有一個需要明白的事,如何判斷兩個字符串的大小?
其實很簡單,就類似我們查字典的過程。哪個單詞越靠前,它就越小。
下面是關於串的一些基本操作的代碼。
頭文件與宏定義:
(數組下標爲零的單元存放串長)
#include<stdio.h>
#include "string.h"
#define MAXSIZE 40 /* 存儲空間初始分配量 */
typedef int ElemType;
typedef char String[MAXSIZE + 1]; /* 0號單元存放串的長度 */
typedef enum{ False = 0, True = 1 }Bool;
生成:
Bool StrAssign(String T, char *chars)
{/* 生成一個其值等於chars的串T */
int i;
if (strlen(chars) > MAXSIZE)
return False;//chars不能大於存儲空間初始分配量
else
{
T[0] = strlen(chars);//第一個單元存入chars大小
for (i = 1; i <= T[0]; ++i)
{
T[i] = *(chars + i - 1);//順序賦值
}
return True;
}
}
清空:
Bool ClearString(String S)
{/* 將S清爲空串 */
S[0] = 0;
return True;
}
複製:
Bool StrCopy(String T, String S)
{/* 由串S複製得串T */
for (int i = 0; i <= S[0]; ++i)
{
T[i] = S[i];
}
return True;
}
是否爲空:
Bool StrEmpty(String S)
{/* 若S爲空串,則返回True,否則返回False */
if (0 == S[0])
return True;
else
return False;
}
串長:
int StrLength(String S)
{/* 返回串的元素個數 */
return S[0];
}
比較:
int StrCompare(String S, String T)
{/* 若S>T,則返回值>0;若S=T,則返回值=0;若S<T,則返回值<0 */
for (int i = 0; i <= S[0] && i <= T[0]; ++i)
{
if (S[i] != T[i])
{
return S[i] - T[i];
}
}
return S[0] - T[0];
}
拼接:
Bool Concat(String T, String S1, String S2)
{/* 若未截斷,則返回True,否則False */
if (S1[0] + S2[0] <= MAXSIZE)
{//兩字符串長度和小於最大長度時
for (int i = 1; i <= S1[0]; ++i)
{
T[i] = S1[i];
}
for (int i = 1; i <= S2[0]; ++i)
{
T[S1[0] + i] = S2[i];
}
T[0] = S1[0] + S2[0];
return True;
}
else
{//兩字符串長度和大於最大長度時
for (int i = 1; i <= S1[0]; ++i)
{
T[i] = S1[i];
}
for (int i = 1; i <= MAXSIZE-S1[0]; ++i)
{
T[S1[0] + i] = S2[i];
}
T[0] = MAXSIZE;
return False;
}
}
查找子串:
int Index(String S, String T, int pos)
{/*返回子串T在主串S中第pos個字符之後的位置。若不存在,則函數返回值爲0*/
int i = pos;
int j = 1;
while (i <= S[0] && j <= T[0])
{
if (S[i] == T[j])
{
i++;
j++;
}
else
{
i = i - j + 2;
j = 1;
}
}
if (j > T[0])
return i - T[0];
else
return 0;
}
返回子串:
Bool SubString(String Sub, String S, int pos, int len)
{/* 用Sub返回串S的第pos個字符起長度爲len的子串。 */
if (pos > S[0] || pos < 1 || len<0 || len>S[0] - pos + 1)
{
return False;
}
for (int i = 1; i <= len; ++i)
{
Sub[i] = S[pos + i - 1];
}
Sub[0] = len;
return True;
}
替換子串:
Bool Replace(String S, String T, String V)
{/* 用V替換主串S中出現的所有與T相等的不重疊的子串 */
if (StrEmpty(S) || StrEmpty(T))
{
return False;
}
int i = 1;
do
{
i = Index(S, T, i);
if (i)
{
StrDelete(S, i, StrLength(T));
StrInsert(S, i, V);
i += StrLength(V);
}
}while (i);
return True;
}
插入子串:
Bool StrInsert(String S, int pos, String T)
{/*在串S的第pos個字符之前插入串T。插入返回True,否則返回False */
int i;
if (pos<1 || T[0] + S[0]>MAXSIZE || pos > S[0] + 2)
return False;
if (pos == S[0] + 2)
{
for (i = 1; i <= T[0]; ++i)
{
S[S[0] + i] = T[i];
}
}
else
{
for (i = S[0]; i >= pos;i--)
{
S[i + T[0]] = S[i];
}
for (i = pos; i < pos + T[0]; i++)
{
S[i] = T[i - pos + 1];
}
}
S[0] = S[0] + T[0];
return True;
}
刪除子串:
Bool StrDelete(String S, int pos, int len)
{/* 從串S中刪除第pos個字符起長度爲len的子串 */
if (pos<1 || pos>S[0] + 1 - len || len < 0)
{
return False;
}
for (int i = pos + len; i <= S[0]; i++)
{
S[i - len] = S[i];
}
S[0] = S[0] - len;
return True;
}
輸出:
Bool StrShow(String T)
{/* 輸出串T */
if (0 == T[0])
return False;
int i = 1;
while (T[i])
{
printf("%c", T[i]);
++i;
}
printf("\n");
return True;
}
謝觀~
(:з)∠)