#include <stdio.h>
#include <stdlib.h>
//自定义
#define MAXLEN 255 //预定义的最大串长
#define true 1
#define false 0
#define bool char
//串的顺序存储结构
typedef struct
{
char ch[MAXLEN + 1];
int length;
}SString;
//串的初始化
bool StrInit(SString* Str)
{
Str->length = 0;
return true;
}
//求串长
int StrLength(SString Str)
{
return Str.length;
}
//清空
bool StrClear(SString* Str)
{
Str->length = 0;
return true;
}
//判空
bool StrEmpty(SString Str)
{
return !Str.length;
}
//赋值,把字符串ch的内容赋值给T
bool StrAssign(SString* T, char* ch)
{
//如果T没空间那判错
if(!T)
{
printf("StrAssign:T is NULL!\n");
return false;
}
//把输入的字符串依次输入进串里
int i = 1;
for(i = 1; ch[i-1] != '\0'; i++)
{
if(i <= MAXLEN)
{
T->ch[i] = ch[i-1];
}
else break;
}
//字符串的长度+1
T->length = i-1;
return true;
}
//输出存储字符串
bool StrPrint(SString Str)
{
//如果是空的或错的就不用输出了
if(StrEmpty(Str))
{
printf("StrPrint:The SString is an empty sstring or an error sstring\n");
return false;
}
//把串中每个字符依次输出
for(int i = 1; i <= Str.length; i++)
{
printf("%c",Str.ch[i]);
}
printf("\nLength = %d\n\n", StrLength(Str));
return true;
}
//复制操作,把S复制给T
bool StrCopy(SString* T, SString S)
{
//先判空
if(StrEmpty(S))
{
printf("StrCopy:The copied SString is an empty SString\n");
return false;
}
//把一个串中的元素依次赋值给第二个串
for(int i = 1; i < S.length; i++)
{
T->ch[i] = S.ch[i];
}
//长度直接设为被复制串的长度
T->length = S.length;
return true;
}
//串联接,把S1和S2连接后输出在T中
bool StrConCat(SString* T, SString S1, SString S2)
{
//都是空的时候就不用链接了
if(StrEmpty(S1) || StrEmpty(S2))
{
printf("StrConcat:At least one fo the two sstring is an empty sstring\n");
return false;
}
//把第一个的值复制进T
StrCopy(T, S1);
//从第一个串长度的数开始i,依次向后遍历,到两个串加起来的长度,并且长度不能超过最大长度
for(int i = T->length + 1; i <=(StrLength(S1)+StrLength(S2)) && i < MAXLEN; i++)
{
T->ch[i] = S2.ch[i - StrLength(S1)];
}
//串长
T->length = S1.length+S2.length;
return true;
}
//求子串,sub是要求的字串, S为原串,pos为字串开始的位置,len为字串的长度
bool SubString(SString* Sub, SString S, int pos, int len)
{
//如果子串位置和长超过了界限,判错
if((pos+len-1) > StrLength(S))
{
printf("SubString:The substring does not exist\n");
return false;
}
for(int i = pos; i <= pos+len-1; i++)
{
Sub->ch[i-pos+1] = S.ch[i];
}
Sub->length = len;
return true;
}
//串比较
int StrCompare(SString Str1, SString Str2)
{
for(int i = 1; i <= StrLength(Str1) && i <= StrLength(Str2); i++)
{
if(Str1.ch[i] != Str2.ch[i])
//返回值小于零还是大于零决定哪个字符串大
return Str1.ch[i] - Str2.ch[i];
}
//如果没比较出谁最大谁小的话, 就看哪个字符串长
return StrLength(Str1) - StrLength(Str2);
}
//顺序存储字符串的定位操作, S是主串,T是要搜索的字串,找到就返回位置
int StrIndex(SString S, SString T)
{
if(StrEmpty(S))
return false;
int i = 1;
//临时存储子串
SString sub;
//遍历对比
while(i <= StrLength(S)-StrLength(T)+1)
{
//调用子串函数,把调出的字串传给sub
SubString(&sub, S, i, StrLength(T));
//如果对比的结果是0说明相等,S中有子串T
if(StrCompare(sub, T) != 0) i++;
else return i;
}
//到最后也没找到,返回-1
return -1;
}
int main()
{
//初始化
SString str1, str2, str3;
StrInit(&str1);
StrInit(&str2);
StrInit(&str3);
//测试赋值
StrAssign(&str1,"Str1:ABC");
StrAssign(&str2,"HUAWEI matepad pro!!");
StrAssign(&str3,"Str3:IPhone 13 Pro Plus 666!");
//测试复制
StrCopy(&str1, str2);
//测试输出
StrPrint(str1);
StrPrint(str2);
StrPrint(str3);
//若对您有帮助请点个赞哦~
return 0;
}
C语言 串的实现练习
于 2022-04-16 20:38:37 首次发布