#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXSIZE 40
typedef char String[MAXSIZE + 1];
bool StrAssign(String T, char* 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)
{
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)
{
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)
{
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;
}
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;
}
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;
}
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;
}
}
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;
}
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;
}