文章目录:
- 串的相关概念
- 串的常用基本操作
1.串的概念和相关术语
2.串的基本操作
- 赋值操作
//赋值操作
int strassign(String &str,char *ch)
{
//if(str.ch)
//free(str.ch);//释放原串空间
int len=0;
char *c=ch;
while(*c)//求ch串的长度
{
++len;
++c;
}
if(len==0)//如果ch为空串,则直接返回空串
{
str.ch==NULL;
str.length=0;
return 1;
}
else
{
str.ch=(char*)malloc(sizeof(char)*(len+1));//取len+1是为了多分配一个空间存放'\0'字符
if(str.ch=NULL)
return 0;
else
{
c=ch;
for(int i=0;i<=len;++i,++c)
str.ch[i]=*c;
str.length=len;
return 1;
}
}
}
- 取串的长度
//取串长度
int strlength(String str)
{
return str.length;
}
- 串的比较
//串比较
int strcompare(String s1,String s2)
{
for(int i=0;i<s1.length && i<s2.length;++i)
if(s1.ch[i]!=s2.ch[i])
return s1.ch[i]-s2.ch[i];
return s1.length-s2.length;
}
- 串的连接
//串连接
int concat(String &str,String str1,String str2)
{
/* if(str.ch)
{
free(str.ch);
str.ch=NULL;
}*/
str.ch=(char*)malloc(sizeof(char)*(str1.length+str2.length+1));
if(str.ch==NULL)
return 0;
int i=0;
while(i<str1.length)
{
str.ch[i]=str1.ch[i];
++i;
}
int j=0;
while(j<=str2.length)
{
str.ch[i+j]=str2.ch[j];
++j;
}
str.length=str1.length+str2.length;
return 1;
}
- 求子串
int substring(String &substr,String str,int pos,int len)
{
if(pos<0||pos>=str.length||len<0||len>str.length-pos)
return 0;
if(len==0)
{
substr.ch=NULL;
substr.length=0;
return 1;
}
else
{
substr.ch=(char*)malloc(sizeof(char)*(len+1));
int i=pos;
int j=0;
while(i<pos+len)
{
substr.ch[j]=str.ch[i];
++i;
++j;
}
substr.ch[j]='\0';
substr.length=len;
return 1;
}
}
- 串清空
//串清空
int clearstring(String &str)
{
if(str.ch)
{
free(str.ch);
str.ch=NULL;
}
str.length=0;
return 1;
}
- 完整代码
#include<stdio.h>
//#include<iostream>
#include<stdlib.h>
#include<malloc.h>
//using namespace std;
typedef struct{
char *ch;
int length;
}HString;
//为串分配空间、赋值
int StrAssign(HString &T,char *chars){
int i;
// if(T.ch)free(T.ch); //释放T原有空间 【1】
char *c=chars;
for(i=0;*c!='\0';++i,++c); //求chars的长度i
if(!i){
T.ch=NULL;
T.length=0;
}else{
if(!(T.ch=(char*)malloc(i*sizeof(char))))return 0; //分配空间的同时判断是否成功分配
for(int j=0;j<i;j++)
T.ch[j]=chars[j];
T.length=i;
}
return 1;
}
//求长度
int StrLength(HString S){
return S.length;
}
//字符串比较
int StrCompare(HString S,HString T){
//规则:若S>T,则返回值>0,若S=T,则返回值=0,若S<T,则返回值<0
for(int i=0;i<S.length&&i<T.length;++i)
if(S.ch[i]!=T.ch[i])
return S.ch[i]-T.ch[i];
return S.length-T.length;
}
int ClearString(HString &S){
//将S清为空串
if(S.ch){
free(S.ch);
S.ch=NULL;
}
S.length=0;
return 1;
}
int SubString(HString &Sub,HString S,int pos,int len){
//用Sub返回串S的第pos个字符起长度为len的子串
//1<=pos<=StrLength(S)且0<=len<=StrLength(S)-pos+1
if(pos<1||pos>S.length||len<0||len>S.length-pos+1)
return 0;
// if(Sub.ch)free(Sub.ch); //【2】
if(!len){
Sub.ch=NULL;
Sub.length=0;
}else{
Sub.ch=(char*)malloc(len*sizeof(char));
for(int i=0;i<len;i++)
Sub.ch[i]=S.ch[pos-1+i];
Sub.length=len;
}
return 1;
}
int Concat(HString &T,HString S1,HString S2){
//用T返回由S1和S2连接而成的新串ksckslm
// if(T.ch)free(T.ch);
T.ch=(char*)malloc((S1.length+S2.length)*sizeof(char));
// if(!());
// return 0;
for(int i=0;i<S1.length;i++){
T.ch[i]=S1.ch[i];
}
T.length=S1.length+S2.length;
for(int i=0;i<S2.length;i++){
T.ch[S1.length+i]=S2.ch[i];
}
return 1;
}
int main(){
int res;
HString str1,str2,str3,str4;
int l1,l2;
char s1[5];
char s2[5];
scanf("%s%s",s1,s2);
StrAssign(str1,s1);
StrAssign(str2,s2);
printf("%s\n",str1.ch);
printf("%s\n",str2.ch);
res=StrCompare(str1,str2);
printf("%d\n",res);
SubString(str3,str1,1,3);
printf("%s\n",str3.ch);
Concat(str4,str1,str2);
printf("%s\n",str4.ch);
// ClearString(str);
// printf("清空后:\n");
// printf("%s\n",str.ch);
return 0;
}