注意事项:
- 串是由零个或多个字符组成的有限序列。零个字符的串成为空串。串中任意个字符组成的子序列成为该串的子串。包含子串的串成为主串。
- 通常称字符在序列中的序号为该字符在串中的位置。只有当两个串的长度和各个对应位置的字符都相等时,两串才相等。
- 串的逻辑结构和线性表相似,但基本操作不同。串多以整体为操作对象,如查找子串、求取子串、在某个位置插入子串及删除。
- 串的存储方法有:定长顺序存储、堆分配存储、块链存储
#include<stdio.h>
#include<malloc.h>
#define MAX_LEN 100
typedef char SString[MAX_LEN+1];
int SubString(SString Sub, SString S, int pos, int len);
int Index1(SString S, SString T, int pos);
int StrInsert(SString S, int pos, SString T);
int StrDelete(SString S, int pos, int len);
void StrPrint(SString S);
int StrAssign(SString T, char * chars);
int main()
{
char s, c[MAX_LEN + 1];
SString t, s1, s2;
printf("请输入s1:");
gets(c);
StrAssign(s1, c);
SubString(s2, s1, 3, 10);
int i = Index1(s1, s2, 1);
printf("s2的子串在s1的%d位后\n", i);
printf("将s2插入到s1的开头:");
StrInsert(s1, 1, s2);
StrPrint(s1);
printf("将刚才插入的删除后:");
StrDelete(s1, 1, 10);
StrPrint(s1);
return 0;
}
int SubString(SString Sub, SString S, int pos, int len)
{
for (int i = 1; i <= len; i++)
Sub[i] = S[pos + i - 1];
Sub[0] = len;
return 1;
}
int Index1(SString S, SString T, int pos)
{
int i, j;
if (pos >= 1 && pos <= S[0])
{
i = pos;
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;
}
else
return 0;
}
int StrInsert(SString S, int pos, SString T)
{
int i;
if (pos < 1 || pos > S[0] + 1)
return 0;
if (S[0] + T[0] <= MAX_LEN)
{
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] += T[0];
return 1;
}
else
{
for (i = MAX_LEN;i >= pos + T[0]; i--)
S[i] = S[i - T[0]];
for (i = pos; i < pos + T[0] && i <= MAX_LEN; i++)
S[i] = T[i - pos + 1];
S[0] = MAX_LEN;
return 0;
}
}
int StrDelete(SString S, int pos, int len)
{
int i;
if (pos < 1 || pos > S[0] - len + 1 || len < 0)
return 0;
for (i = pos + len; i <= S[0]; i++)
S[i - len] = S[i];
S[0] -= len;
return 1;
}
void StrPrint(SString S)
{
int i;
for (i = 1; i <= S[0]; i++)
printf("%c", S[i]);
printf("%\n");
}
int StrAssign(SString S, char * chars)
{
int i;
if (strlen(chars) > MAX_LEN)
return 0;
else
{
S[0] = strlen(chars);
for (i = 1; i <= S[0]; i++)
S[i] = *(chars + i - 1);
return 1;
}
}