/*顺序串*/
#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;
}
串的操作-C语言
最新推荐文章于 2021-12-15 14:07:34 发布