(1)串的结构体定义
//定长顺序存储表示
typedef struct{
char str[maxSize+1]; //多出一个‘\0’作为结束标记
int length;
}Str;
//变长分配存储表示
typedef struct{
char *ch; //指向动态分配存储区首地址的字符指针
int length;
}Str;
(2)串的基本操作
//赋值操作
int fuzhi(Str &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 = nullptr;
str.length = 0;
return 1;
}else{
str.ch = (char *)malloc(sizeof(char)*(len+1)); //取len+1是为了‘\0’
if(str.ch == mullptr) //分配失败
return 0;
else{
c = ch;
for(int i=0; i<=len; i++, c++){
str.ch[i] = *c;
}
str.length = len;
return 1;
}
}
}
//取串长
int strLength(Str str){
return str.length;
}
//串比较
int strCompare(Str s1, Str 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(Str &str, Str s1, Str s2){
if(str.ch){
free(str.ch);
str.ch = nullptr;
}
str.ch = (char *)malloc(sizeof(char)*(s1.length+s2.length));
if(str.ch == nullptr) //分配失败
return 0;
int i = 0;
while(i < s1.length){ //不复制‘\0’
str.ch[i] = s1.ch[i];
i++;
}
int j = 0;
while(j <= s2.length){ //复制‘\0’
str.ch[i+j] = s2.ch[j];
j++;
}
str.length = s1.length + s2.length;
return1;
}
//求子串
int subString(Str &substr, Str str, int pos, int len){
if(pos<0 || pos>=str.length || len<0 || len>str.length-pos)
return 0;
if(substr.ch){
free(substr.ch);
substr.ch = nullptr;
}
if(len == 0){ //字串长度为0
substr.ch = nullptr;
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++]; //复制
}
substr.ch[j] = '\0'; //字符串最后别忘了加上‘\0’
substr.length = len;
return 1;
}
}
//串清空
int clearString(Str &str){
if(str.ch){
free(str.ch);
str.ch = nullptr;
}
str.length = 0;
return 1;
}