串的一些基础操作(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;
}

谢观~
(:з)∠)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值