字符串和相关 *** 作

字符串和相关 *** 作,第1张

字符串和相关 *** 作

第一个字符不存数据,存储字符串的长度

main函数和声明

# include 
# include    
# include   
# include 

#define MAXSIZE 40 

typedef int ElemType;	

typedef char String[MAXSIZE+1]; 

bool StrAssign(String T,char *chars);
bool StrCopy(String T,String S);
bool StrEmpty(String S);
int StrCompare(String S,String T);
int StrLength(String S);
bool ClearString(String S);
bool Concat(String T,String S1,String S2);
bool SubString(String Sub,String S,int pos,int len);
int Index(String S, String T, int pos);
int Index2(String S, String T, int pos);
bool StrInsert(String S,int pos,String T);
bool StrDelete(String S,int pos,int len);
bool Replace(String S,String T,String V);
void StrPrint(String T);

int main()
{
	
	int i,j;
	bool k;
	char s;
	String t,s1,s2;
	printf("请输入串s1: ");
	
	k=StrAssign(s1,"abcd");
	if(!k)
	{
		printf("串长超过MAXSIZE(=%d)n",MAXSIZE);
		exit(0);
	}
	printf("串长为%d 串空否?%d(1:是 0:否)n",StrLength(s1),StrEmpty(s1));
	StrCopy(s2,s1);
	printf("拷贝s1生成的串为: ");
	StrPrint(s2);
	printf("请输入串s2: ");
	
	k=StrAssign(s2,"efghijk");
	if(!k)
	{
		printf("串长超过MAXSIZE(%d)n",MAXSIZE);
		exit(0);
	}
	i=StrCompare(s1,s2);
	if(i<0)
		s='<';
	else if(i==0)
		s='=';
	else
		s='>';
	printf("串s1%c串s2n",s);
	k=Concat(t,s1,s2);
	printf("串s1联接串s2得到的串t为: ");
	StrPrint(t);
	if(k==false)
		printf("串t有截断n");
	ClearString(s1);
	printf("清为空串后,串s1为: ");
	StrPrint(s1);
	printf("串长为%d 串空否?%d(1:是 0:否)n",StrLength(s1),StrEmpty(s1));
	printf("求串t的子串,请输入子串的起始位置,子串长度: ");

	i=2;
	j=3;
	printf("%d,%d n",i,j);

	k=SubString(s2,t,i,j);
	if(k)
	{
		printf("子串s2为: ");
		StrPrint(s2);
	}
	printf("从串t的第pos个字符起,删除len个字符,请输入pos,len: ");
	
	i=4;
	j=2;
	printf("%d,%d n",i,j);


	StrDelete(t,i,j);
	printf("删除后的串t为: ");
	StrPrint(t);
	i=StrLength(s2)/2;
	StrInsert(s2,i,t);
	printf("在串s2的第%d个字符之前插入串t后,串s2为:n",i);
	StrPrint(s2);
	i=Index(s2,t,1);
	printf("s2的第%d个字母起和t第一次匹配n",i);
	SubString(t,s2,1,1);
	printf("串t为:");
	StrPrint(t);
	Concat(s1,t,t);
	printf("串s1为:");
	StrPrint(s1);
	Replace(s2,t,s1);
	printf("用串s1取代串s2中和串t相同的不重叠的串后,串s2为: ");
	StrPrint(s2);


	return 0;
}

生成一个其值等于chars的串T

// 生成一个其值等于chars的串T
bool StrAssign(String T,char *chars)
{
	if (strlen(chars) > MAXSIZE)
		return false;
	int i;
	T[0] = strlen(chars);
	for (i = 1; i < T[0]; ++i)
	{
		T[i] = *(chars+i-1);
	}
	return true;
}

由串S复制得串T

// 由串S复制得串T
bool StrCopy(String T,String S)
{
	int i = 0;
	for (i = 0; i <= strlen(S); ++i)
	{
		T[i] = S[i];
	}
	return true;
}

判断S串是否为空

//判断S串是否为空


bool StrEmpty(String S)
{
	if (S[0] == 0)
		return true;
	else
		return false;
}

串S和T存在 若S>T,则返回值>0;若S=T,则返回值=0;若S


int StrCompare(String S,String T)
{
	int i;
	for (i = 1; i <= S[0] && i <= T[0]; ++i)
	{
		if (T[i] != S[i])
			return S[i]-T[i];
	}
	return S[0] - T[0];
}

返回串的元素个数

// 返回串的元素个数
int StrLength(String S)
{
	return S[0];
}

串S存在,将S清为空串

// 串S存在,将S清为空串
bool ClearString(String S)
{
	S[0] = 0;
	return true;
}

用T返回S1和S2联接而成的新串。若未截断,则返回true,否则false

// 用T返回S1和S2联接而成的新串。若未截断,则返回true,否则false
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[i+S1[0]] = S2[i];
		T[0] = S1[0] + S2[0];
		return true;
	}
	else
	{
		for (i = 1; i <= S1[0]&&i<=MAXSIZE; ++i)
			T[i] = S1[i];
		for (i = 1; i <= MAXSIZE-S1[0]; ++i)
			T[i+S1[0]] = S2[i];
		T[0] = MAXSIZE;
		return false;
	}
}

用Sub返回串S的第pos个字符起长度为len的子串。

// 用Sub返回串S的第pos个字符起长度为len的子串。
bool SubString(String Sub,String S,int pos,int len)
{
	if (pos < 1 || pos > S[0] || len < 1 || len > S[0]-pos+1)
		return false;
	int i;
	for (i = 1; i <= len; ++i)
	{
		Sub[i] = S[pos+i-1];
	}
	Sub[0] = len;
	return true;
}

返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数返回值为0。
其中,T非空,1≤pos≤StrLength(S)。

int Index(String S, String T, int pos)
{
	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;
}

T为非空串。若主串S中第pos个字符之后存在与T相等的子串, 则返回第一个这样的子串在S中的位置,否则返回0

int Index2(String S, String T, int pos) 
{
	int m, n, i;
	String Sub;

	if (pos > 0)
	{
		m = S[0];
		n = T[0];
		i = pos;
		while (i < m-n+1)
		{
			SubString(Sub, S, i, n);
			if (StrCompare(T, Sub) != 0)
				++i;
			else
				return i;
		}
	}
	return 0;
}

串S和T存在,1≤pos≤StrLength(S)+1
在串S的第pos个字符之前插入串T。完全插入返回ture,部分插入返回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 = 1; i <= T[0]; ++i)
		{
			S[i+pos-1] = T[i];
		}
		S[0] += T[0];
	}
	else
	{
		for (i = MAXSIZE; i <= pos; --i)
		{
			S[i] = S[i-T[0]];
		}
		for (i = pos; i < T[0]+pos; ++i)
		{
			S[i] = T[i-pos+1];
		}
		S[0] = MAXSIZE;
		return false;
	}
}

串S存在,1≤pos≤StrLength(S)-len+1
从串S中删除第pos个字符起长度为len的子串

bool StrDelete(String S,int pos,int len)
{
	if (pos < 1 || pos > S[0] || len < 1 || len > S[0]-pos+1)
		return false;
	int i;
	for (i = pos; i < pos+len; ++i)
	{
		S[i] = S[i+len];
	}
	S[0] -= len;

	return true;
}

串S,T和V存在,T是非空串(此函数与串的存储结构无关 )
用V替换主串S中出现的所有与T相等的不重叠的子串

bool Replace(String S,String T,String V)
{
	int i = 1;
	if(StrEmpty(T)) 
		return false;
	do
	{
		i = Index(S, T, i);
		if (i)
		{
			StrDelete(S, i, T[0]);
			StrInsert(S, i, V);
			i += StrLength(V);
		}

	}while(i);
	return true;
}

输出字符串

//输出字符串
void StrPrint(String T)
{
	int i = 1;
	for (; i <= T[0]; ++i)
		printf("%c", T[i]);
	printf("n");
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zaji/5713485.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存