串的基本操作(C++)

#include"iostream"

using namespace std;

//=================串==============================
/*两个串是否相等,必须是它们串的长度以及它们各个对应位置的字符都相等时,才算是相等.
串的顺序存储结构的缺点是字符串的截断,截断就是超过预定义长度的串值被舍去.*/

//=========串的顺序存储===========
/*一般T[0]存放串的大小*/
const int MAXSIZE = 40;
struct StringType
{
	char Str[MAXSIZE];
	int length;
	struct StringType(int x) :length(0){};
};

/*输出字符串T*/
bool StringVisit(const StringType *T)
{
	if (T->length==0)
	{
		cout << "空串!" << endl;
		return false;
	}
	else
	{
		for (int i = 0; i <T->length; i++)
			cout << T->Str[i];
		cout << endl;
		return true;
	}
}

/*生成一个其值为chars的串T*/
bool StrCreate(StringType *T, char *chars)
{
	if (strlen(chars) > MAXSIZE)
		return false;
	else
	{
		T->length = strlen(chars);
		for (int i = 0; i <T->length; i++)
			T->Str[i] = chars[i];
		return true;
	}
}

/* 返回串的元素个数 */
int StrLength(StringType *T)
{
	return T->length;
}

/*串比较: 
初始条件: 串S和T存在 
操作结果: 若S>T,则返回值>0;若S=T,则返回值=0;若S < T,则返回值< 0 */
int StrComp(const StringType *T, const StringType *S)
{
	for (int i = 0; i < T->length && i < S->length; i++)
	{
		if (S->Str[i]!=T->length)
			return S->Str[i] - T->Str[i];
	}
	return S->length - T->length;

}


/* 用T返回S1和S2联接而成的新串。若未截断,则返回TRUE,否则FALSE */
bool Contact(StringType *T, StringType *S1, StringType *S2)
{
	if (S1->length + S2->length <= MAXSIZE)
	{
		for (int i = 0; i < S1->length; i++)
			T->Str[i] = S1->Str[i];
		for (int j = 0; j < S2->length; j++)
			T->Str[j] = S2->Str[j];
		T->length = S1->length + S2->length;
		return true;
	}
	else
	{
		for (int i = 0; i < S1->length; i++)
			T->Str[i] = S1->Str[i];
		for (int j = 0; j < MAXSIZE-S1->length; j++)
			T->Str[j] = S2->Str[j];
		T->length = MAXSIZE;
		return false;
	}
}

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


//kmp模式匹配算法



int main()
{
	char *cc = "asdfchjksj";
	StringType *T = new StringType(0);
	StrCreate(T, cc);
	return 0;
}


更新中.........

基于定长顺序存储结构实现的赋值、比较、求子的位置、替换等操作。要求所有操作均以函数的形式实现,在主函数中调用各个函数实现整体功能。 注意:每一个字符的第一个元素存放的是该字符的长度(不包括第一个元素),除的赋值外,其他所有操作(比较、求子的位置、替换)等都不应包含该字符。 1.1.实验1:赋值函数实现: 按照系统已经定义的函数接口编写函数实体,实现:将输入数组StrInput[]的数据赋值给待赋值数组StrTobeAssigned[],其中待赋值数组StrTobeAssigned[0]存放有效数据的长度,StrTobeAssigned[1]之后存放带赋值数据。 具体要求和相关假设为: ① 函数接口定义为:int MyStrAssign(char * StrTobeAssigned, char * StrInput); ② 输入参数:待赋值字符变量StrTobeAssigned,字符的期望值StrInput; ③ 输出参数:无; ④ 处理规则及返回值:将StrTobeAssigned[1]及之后的内容赋值为StrInput的有效内容,StrTobeAssigned[0]赋值为StrInput有效字符的长度,并返回1; ⑤ 假设: a)两个字符均不为空; b)StrInput存放的是一个完成的字符(不包含长度); c)赞不考虑输入数据超过数组总长度的情况。 1.2实验2:替换函数: 按照系统已经定义的函数接口编写函数实体,实现:在主中MainStr查找是否存在某特定子SubStr1,若存在则将所有的SubStr1替换为新的指定子SubStr2,函数返回字符替换的次数。 具体要求和相关假设为: ① 函数接口定义为:int MyStrReplace(char * MainStr, char * SubStr1, char * SubStr2); ② 输入参数:主变量MainStr,子变量SubStr1,SubStr2; ③ 输出参数:无; ④ 处理规则及返回值:若主中存在子,用SubStr2替换主MainStr中出现的所有与SubStr1相同的不重叠的子,并返回字符替换的次数;否则返回0。 ⑤ 假设: a)主和两个子均不为空; b)MainStr[0]和SubStr1[0],SubStr2[0]分别存放对应字符的长度,不用替换该部分。 2.问题分析 (1)根据实验一的内容可知,我们需要通过编写函数实体的形式实现的赋值操作,主要的思路包括: (a)获得输入字符的长度len; (b)将输入字符的长度len赋值给待赋值字符的第一个元素StrTobeAssigned[0]; (c)依次将输入字符的数据赋值给待赋值字符。 (2)根据实验二的内容可知,我们需要通过编写函数实体的形式实现的替换操作,主要的思路包括: (a)遍历主MainStr,检查是否存在某特定子SubStr1; (b)如果存在则找到子在主中的位置; (c)在主中删除该子并更新主长度; (d)在主中插入该子并更新主长度; (e)过程中记录替换字符的次数,遍历结束后返回该次数(如果没有替换则为0); 如果有必要,可以使用本实验已经提供的相关函数,如:求子位置的函数MySubStrIndex(),子删除函数MyStrDelete()和子插入函数MyStrInsert()等
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值