9-串的操作

字符串

#include <stdio.h>
#include <malloc.h>
#include <stdbool.h>


#define MaxSize 100
/*静态串的定义*/
typedef struct{
    /*串的最大长度+ 一个'\0',并且从下标1开始存储*/
    char cha[MaxSize+2];
    /*记录串的长度*/
    int length;
}Str_static;

/*动态串的定义*/
typedef struct{
    char *ch;//串
    int length;//记录串的长度
} Str_dynamic;


/**
 * 将字符串ch赋值给串str :从1开始
 * @param str
 * @param ch
 * @return
 */
bool strAssign(Str_dynamic *str, char *ch){
    /*释放原串空间*/
    if(str != NULL){
        free(str->ch);
        /*防止重复释放*/
        str->ch=NULL;
    }
    /*记录串的长度*/
    int len=-1;
    /*统计字符串长度*/
    while(ch[++len] != '\0');
    /*空串*/
    if(len==0){
        str->ch=NULL;
        str->length=0;
        return  0;
    }
    //申请存储串的空间 +2是因为要存 入'\0',并且下标1开始是有效内容
    str->ch=(char *)malloc(sizeof (char) *(len+2));
    if(str->ch==NULL){

        printf("申请空间失败");
        return  false;
    }
    /*将字符串复制到串中*/
    for (int i = 1; i <=len+1; ++i) {
        str->ch[i]=ch[i-1];
    }

    /*记录串的长度*/
    str->length=len;
    return  true;


}

/**
 * 获取串的长度
 * @param str
 * @return
 */
int getStrLength(Str_dynamic str){
    return str.length;
}
/**
 * 比较两个串的大小
 * @param s1
 * @param s2
 * @return
 */
int  strCompare(Str_dynamic s1,Str_dynamic s2){

    /*同步遍历,直到其中一个或者两个串遍历借宿*/
    for (int i = 1; i <=s1.length && i<=s2.length; ++i) {
        /*某个位置上 两者的ASCII不相等,ASCII码大的字符串大*/
        if(s1.ch[i]!=s2.ch[i]){
            return s1.ch[i]-s2.ch[i];
        }
    }
    /*如果遍历结束,说明两者相等,返回长度差*/
    return s1.length-s2.length;
}
/**
 * 将两个串连接起来
 * @param Str
 * @param str1
 * @param str2
 * @return
 */
bool strConcat(Str_dynamic Str,Str_dynamic str1,Str_dynamic str2){
    /*释放Str 的空间*/
    if(Str.ch != NULL){
        free(Str.ch);
        /*防止重复释放*/
        Str.ch=NULL;
    }

    /*申请空间 ;+2是因为要存 入'\0',并且下标1开始是有效内容*/
    Str.ch=(char *)malloc(sizeof (char) *(str1.length+str2.length+2));
    if(Str.ch==NULL){
        /*申请空间失败*/
        return false;
    }
    /*从1开始 是有效内容*/
    int i =1;
    while(i<=str1.length){
        Str.ch[i]=str1.ch[i];
        i++;
    }
    while(i<=str1.length+str2.length){
        Str.ch[i]=str2.ch[i-str1.length];
        i++;
    }
    /*设置长度*/
    Str.length=str1.length+str2.length;
    return true;

}
/**
 * 获取子串
 * @param Str_out
 * @param str_in
 * @param pos
 * @param len
 * @return
 */
bool getSubStr(Str_dynamic *Str_out,Str_dynamic str_in,int pos,int len){

    if(pos<1 || pos >str_in.length || len<0 || len>str_in.length-pos+1){
        /*非法参数*/
        return  false;
    }
    /*释放 str_out的空间*/
    if(Str_out->ch != NULL){
        free(Str_out->ch);
        Str_out->ch=NULL;
    }
    if(len ==0){
        /*直接输出空的字符串*/
        Str_out->ch=NULL;
        Str_out->length=0;
        return true;
    }
    /* 输出的字符串:申请空间  +2是因为要存 入'\0',并且下标1开始是有效内容*/
    Str_out->ch=(char *)malloc(sizeof (char) *(len+2));
    if(Str_out->ch==NULL){
        /*申请空间失败*/
        return false;
    }

    /*从1开始 是有效内容*/
    int i=pos, j=1;
    while(i<=pos+len){
        Str_out->ch[j]=str_in.ch[i];
        i++;
        j++;
    }
    Str_out->ch[j]=0;
    /*设置长度*/
    Str_out->length=len;
    return true;

}
bool  clearStr(Str_dynamic *str){
    if(str->ch != NULL){
        /*释放串空间*/
        free(str->ch);
        /*防止重复释放*/
        str->ch=NULL;
    }

    /*设置长度为0*/
    str->length=0;
    return true;
}

int main() {
    //初始化动态串 :长度为2
    Str_dynamic s;
    s.ch=(char *)malloc(sizeof (char) *(2));
    s.length=2;


    printf("Hello, World!\n");
    return 0;
}

posted @ 2024-07-21 16:04  成强  阅读(1)  评论(0编辑  收藏  举报