#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXSIZE 40
typedef char String[MAXSIZE + 1];
bool StrAssign(String T, char* chars)//生成值为chars的串
{
if (strlen(chars) > MAXSIZE)
return false;
else {
T[0] = strlen(chars);
for (int i = 1; i <= T[0]; i++)
{
T[i] = *(chars + i - 1);
}
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 Is_Empty(String S)//判空
{
return S[0] == 0;
}
int StrCompare(String S, String T)//字符串比较,S>T 返回值大于0,相等返回0,S<T 返回值小于0
{
for (int i = 1; i <= S[0] && i <= T[0]; ++i)
if (S[i] != T[i])
return S[i] - T[i];
return S[0] - T[0];
}
int StrLength(String S)//返回串的长度
{
return S[0];
}
bool ClearString(String S)//清串
{
S[0] = 0;
return true;
}
bool Concat(String T, String S1, String S2)//用T返回S1和S2连接成的新串,未截断,返回true,否则返回false
{
int i;
if (S1[0] + S2[0] <= MAXSIZE)
{
for (i = 1; i <= S1[0]; i++)
T[i] = S1[i];
for (i = 1; i <= S2[0]; i++)
T[S1[0] + i] = S2[i];
return true;
}
else
{
for (i = 1; i <= S1[0]; i++)
T[i] = S1[i];
for (i = 1; i <= MAXSIZE - S1[0]; i++)
T[S1[0] + i] = S2[i];
T[0] = MAXSIZE;
return false;
}
return false;
}
//用Sub返回串S的第pos个字符起长度为len的子串。
bool SubString(String Sub, String S, int pos, int len)
{
if (pos<1 || pos>S[0] || 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;
}
//返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数返回值为0
int Index(String S, String T, int pos)//串的匹配
{
int i = pos;
int j = i;
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;
}
int Index2(String S, String T, int pos)//串的匹配
{
int n, m, i;
String sub;
if (pos > 0)
{
n = StrLength(S);
m = StrLength(T);
i = pos;
while (i <= n - m + 1)
{
SubString(sub, S, i, m);
if (StrCompare(sub, T) != 0)
++i;
else return i;
}
}
return 0;
}
//在串S的第pos个字符之前插入串T。完全插入返回TRUE, 部分插入返回FALSE
bool StrInsert(String S, int pos, String T)
{
int i;
if (pos<1 || pos>S[0] + 1)
return false;
if (S[0] + T[0] <= MAXSIZE)
{
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;
}
else {
for (i = MAXSIZE; i <= pos; i--)
S[i] = S[i - T[0]];
for (i = pos; i < pos + T[0]; i++)
S[i] = T[i - pos + 1];
S[0] = MAXSIZE;
return false;
}
}
//从串S中删除第pos个字符起长度为len的子串
bool StrDelete(String S, int pos, int len)
{
if (pos<1 || pos>S[0] - len + 1 || len < 0)
return false;
for (int i = pos + len; i <= S[0]; i++)
S[i - len] = S[i];
S[0] -= len;
return true;
}
//用V替换主串S中出现的所有与T相等的不重叠的子串
bool Replace(String S, String T, String V)
{
int i = 1;
if (Is_Empty(T))
return false;
do {
i = Index(S, T, i);
if (i)
{
StrDelete(S, i, StrLength(T));
StrInsert(S, i, V);
i += StrLength(V);
}
} while (i);
return true;
}
void Show(String T)//输出字符串
{
for (int i = 1; i <= T[0]; i++)
printf("%c", T[i]);
printf("\n");
}
int main()
{
String s1, s2;
StrAssign(s1, "abcd");
Show(s1);
printf("len:%d\n", StrLength(s1));
StrCopy(s2, s1);
Show(s2);
StrAssign(s2, "efghtr");
printf("compare:%d\n", StrCompare(s1, s2));
Show(s2);
StrDelete(s2, 1, 2);
Show(s2);
StrInsert(s2, 4, s1);
Show(s2);
printf("%d\n",Index2(s2,"abc",1));
return 0;
}
串
最新推荐文章于 2021-10-17 17:42:26 发布