串的一些基础操作(c语言)~DS笔记⑥
串
先来看看下面这几句:
黄山落叶松叶落山黄,上海自来水来自海上,还有小岳岳春晚的那句:山西运煤车煤运西山。
诸如此类的句子很多人都听过,他们有一个共同的特点:顺着读,倒着读都一样。他们也有一个共同的名字:回文。
再看下面的这三组英文单词,很有意思。
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;
}
谢观~
(:з)∠)