#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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值