串的操作-C语言

/*顺序串*/
#include<stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXSIZE 40

typedef  struct//定义串
{
	char ch[MAXSIZE];//之所以定义长一点便于操作
	int len;//实际的长度
}SString;//串名
void init(SString *p)//初始化串
{
	char str[] = "hello world";
	strcpy(p->ch,str);
	p->len = 12;
}
int StrInsert(SString *s, int pos, SString t)
{
	//在串S的下标pos处插入字符串t
	if (pos<0 && pos>MAXSIZE - 1)
	{
		printf("插入位置非法\n");
	}
	if (s->len + t.len < MAXSIZE)//插入正常
	{
		for (int i = s->len + t.len - 1; i >= pos + t.len; i--)//所有元素向后移动两位
		{
			s->ch[i] = s->ch[i - t.len];
		}
		for (int i = 0; i < t.len; i++)
		{
			s->ch[i + pos] = t.ch[i];
		}
		s->len = s->len + t.len;
	}
	else
	if (pos + t.len < MAXSIZE)//也就是说插入后大于MAXSIZE但是从插入点计算能够插进去
	{
		for (int i = MAXSIZE - 1; i>t.len + pos - 1; i--)
		{
			s->ch[i] = s->ch[i - t.len];
		}
		for (int i = 0; i < t.len; i++)
		{
			s->len = MAXSIZE;
		}
	}
	else//插入后串长》MAXSIZE,并且串t的部分字符也要舍弃
	{
		for (int i = 0; i < MAXSIZE - pos; i++)
		{
			s->ch[i + pos] = t.ch[i];
		}
		s->len = MAXSIZE;
	}
	return 1;

}
void DeStr(SString *s, int pos,int len)
{
	int i;
	if (pos < 0 || pos>(s->len - len))
		printf("删除位置不合法\n");
	for (i = pos + len; i < s->len; i++)
	{
		s->ch[i - len] = s->ch[i];
	}
	s->len = s->len - len;
	return ;
}
void CopStr(SString *s, SString t)
{
	int i;
	for (i = 0; i < t.len; i++)
	{
		s->ch[i] = t.ch[i];
	}
	s->len = t.len;
}
void EmpStr(SString *s)
{
	if (s->len == 0)
		printf("为空\n");
	else
		printf("不为空\n");
}
int CpStr(SString *s, SString t)
{
	for (int i = 0; i < s->len&&t.len; i++)
	{
		if (s->ch[i] != t.ch[i])
		{
			return (s->ch[i] - t.ch[i]);
		}
	}
	return (s->len - t.len);
}
int StrLen(SString *s)
{
	return s->len;
}
int ConStr(SString *s, SString t)
{
	int i, flag;
	if (s->len + t.len <= MAXSIZE)//连接小于MAXSIZE
	{
		for (i = s->len; i < s->len + t.len; i++)
		{
			s->ch[i] = t.ch[i - t.len];
		}
		s->len += t.len;
		flag = 1;
	}
	else
	if (s->len < MAXSIZE)/*连接后的函数大于MAXSIZE,但是串S的长度小于MAXSIZE*/
	{
		for (int i = s->len; i < MAXSIZE; i++)
		{
			s->ch[i] = t.ch[i - s->len];
		}
		s->len = MAXSIZE;
		flag = 0;
	}
	else
		flag = 0;
	return flag;
}
void subStr(SString *s, int len, int pos, SString t)//将串s的部分复制到t中
{
	for (int i = 0; i <=len; i++)
	{
		t.ch[i] = s->ch[i + pos];
	}
	t.len = len;
	for (int i = 0; i < len; i++)
	{
		printf("%c", t.ch[i]);
	}
}
int Strindex(SString *s, int pos, SString t)//顺序串的简单模式匹配函数(布鲁特-福斯算法)
{
	int i, j, start;
	if (t.len == 0)return (0);
	start = pos; i = start; j = 0;
	while (i < s->len&&j < t.len)
	{
		if (s->ch[i] == t.ch[j])
		{
			i++; 
			j++;
		}
		else
		{
			start++;
			i = start;
			j = 0;
		}
	}
	if (j > t.len) return start;//找到了匹配点
	else return -1;
}
int main()
{
	SString temp;
	init(&temp);
	SString t;
	strcpy(t.ch, "happy ");
	t.len = 6;
	StrInsert(&temp, 6, t);
	for (int i = 0; i < strlen((&temp)->ch); i++)
	{
		printf("%c", (&temp)->ch[i]);
	}

	getchar();
	getchar();
	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值