C语言实现顺序字符串的基本操作

38 篇文章 0 订阅
27 篇文章 0 订阅
#include "stdio.h"
#include "string.h"
#include "stdbool.h"

#define MAXLEN 255 // 预定义最大串长255

typedef struct {
    char ch[MAXLEN];
    int len;
} SString;

//赋值操作
void strAssign(SString *S, char chars[]) {
    for (int i = 1; i < strlen(chars)+1; i++) {
        S->ch[i] = chars[i];
    }
    S->len = strlen(chars);
    return;
}

//复制操作
void strCopy(SString *S, SString T) {
    for (int i = 1; i < strlen(T.ch)+1; ++i) {
        S->ch[i] = T.ch[i];
    }
    S->len = T.len;
    return;
}

//判空操作
bool strEmpty(SString S) {
    return S.len == 0;
}

//比较操作
int strCompare(SString S, SString T) {
    for (int i = 1; i < S.len+1 && i < T.len+1; ++i) {
        if (S.ch[i] < T.ch[i]) {
            return -1;
        } else if (S.ch[i] > T.ch[i]) {
            return 1;
        }
    }
    if (S.len > T.len) {
        return 1;
    } else if (S.len < T.len) {
        return -1;
    } else {
        return 0;
    }
}

//求串长操作
int strLength(SString S) {
    return S.len;
}

//求子串
SString *subString(SString *Sub, SString S, int pos, int len) {
    if(pos<1||pos>S.len||len<0||len+pos-1>S.len){
        return NULL;
    }
    Sub->len=len;
    for (int i = pos; i < pos+len; ++i) {
        Sub->ch[i-pos]=S.ch[i];
    }
    return Sub;
}

//串联接操作
SString *concat(SString *T,SString S1,SString S2)
{
    T->len=S1.len+S2.len;
    for (int i = 1; i < S1.len+1; ++i) {
        T->ch[i] = S1.ch[i];
    }
    for (int i = S1.len; i < S1.len+S2.len; ++i) {
        T->ch[i] = S2.ch[i-S1.len];
    }
    return T;
}

//子串定位操作
int index(SString Sub, SString S) {
    if (Sub.len > S.len) {
        return 0;
    }
    for (int i = 0; i < S.len - Sub.len; ++i) {
        int j = 0;
        while (j < Sub.len && Sub.ch[j + 1] == S.ch[i + j]) {
            j++;
        }
        if (j == Sub.len) {
            return i;
        }
    }
    return 0;
}

//清空操作
void clear(SString *S) {
    S->len = 0;
    return;
}

//销毁操作
void destroy(SString *S) {
    S->len = 0;
    S = NULL;
    return;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值