纯C++实现串的基本操作

部分函数详解:
1.strAssign:串的赋值操作不能直接用 = 实现。因为串是一个数组,而 = 不能直接将一个数组赋值给另一个数组,这就要求我们必须对数组中的元素进行逐个赋值。
2.strCompare:串的比较是串排序应用中的核心操作。设两串待比较的字符分别为a、b,若a的码值小于b的码值,返回a < b;大于返回a > b。若a = b则继续比较下一对字符。如果上述步骤完成后没有比较出结果,那么先结束的就是较小串,同时结束则相等。
#include "iostream"

#define MAXSIZE 100
using namespace std;

//定长字符串
struct staticString {
    char str[MAXSIZE + 1];
    int length;
};

//考研常考变长字符串
struct variableString {
    char *str;
    int length;
};

//串赋值
bool variableStringAssign(variableString &variableStr, char *ch);

//获取串长度
int getLength(variableString variableString);

//串比较
int stringCompare(variableString variableString1, variableString variableString2);

//串拼接
bool concat(variableString &result, variableString variableString1, variableString variableString2);

//取子串
bool subString(variableString &result, variableString variableString1, int from, int length);

//清空串
bool clean(variableString &variableString1);

int main() {
    variableString string1{};
    //串赋值
    char ch[MAXSIZE] = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '\0'};
    variableStringAssign(string1, ch);
    for (int i = 0; i < string1.length; ++i) {
        cout << string1.str[i];
    }
    cout << endl;

    //串比较
    variableString string2{};
    string2.str = ch;
    string2.length = string1.length;
    //向string1中添加字符进行测试
//    string1.str[string1.length] = 'a';
//    string1.str[++string1.length] = '\0';
    if (stringCompare(string1, string2) == 0) {
        cout << "string1 equals string2" << endl;
    } else if (stringCompare(string1, string2) > 0) {
        cout << "string1 is bigger than string2";
    } else {
        cout << "string1 is smaller than string2";
    }

    //串拼接
    variableString result1{};
    concat(result1, string1, string2);
    while (*result1.str != '\0') {
        cout << *result1.str++;
    }
    cout << endl;

    //取子串
    variableString result2{};
    subString(result2, string1, 2, 4);
    while (*result2.str != '\0') {
        cout << *result2.str++;
    }
    cout << endl;

    if (clean(string1)) {
        cout << "string1 have been emptied!" << endl;
    }
}

bool variableStringAssign(variableString &variableStr, char *ch) {
    delete variableStr.str;

    int length = 0;
    char *c = ch;

    while (*c != '\0') {
        length++;
        c++;
    }

    if (length == 0) {
        variableStr.str = nullptr;
        variableStr.length = 0;
        return true;
    } else {
        variableStr.str = new char[length + 1];
        if (variableStr.str == nullptr) {
            return false;
        } else {
            c = ch;
            for (int i = 0; i <= length; ++i, ++c) {
                variableStr.str[i] = *c;
            }
            variableStr.length = length;
            return true;
        }
    }
}

int getLength(variableString variableString) {
    return variableString.length;
}

int stringCompare(variableString variableString1, variableString variableString2) {
    for (int i = 0; i < variableString1.length && i < variableString2.length; ++i) {
        if (variableString1.str[i] != variableString2.str[i]) {
            return variableString1.str[i] - variableString2.str[i];
        }
    }

    //前边都一样,比较字符串的长度
    return variableString1.length - variableString2.length;
}

bool concat(variableString &result, variableString variableString1, variableString variableString2) {
    delete result.str;
    result.str = nullptr;

    result.str = new char[variableString1.length + variableString2.length + 1];
    if (result.str == nullptr) {
        cerr << "Your memory is not enough" << endl;
        return false;
    }

    int i = 0;
    while (i < variableString1.length) {
        result.str[i] = variableString1.str[i];
        i++;
    }

    int j = 0;
    while (j <= variableString2.length) {
        result.str[i + j] = variableString2.str[j];
        j++;
    }

    result.length = variableString1.length + variableString2.length;

    return true;
}

bool subString(variableString &result, variableString variableString1, int from, int length) {
    if (from < 0 || from > variableString1.length || length < 0 || length > variableString1.length - from) {
        cerr << "Your parameters is wrong, please check";
        return false;
    }

    delete result.str;
    result.str = nullptr;

    if (length == 0) {
        result.str = nullptr;
        result.length = 0;
        return true;
    } else {
        result.str = new char[length + 1];
        int i = from;
        int j = 0;
        while (i < from + length) {
            result.str[j++] = variableString1.str[i++];
        }

        result.str[j] = '\0';
        result.length = length;
        return true;
    }
}

bool clean(variableString &variableString1) {
    delete variableString1.str;
    variableString1.str = nullptr;
    variableString1.length = 0;

    return true;
}
基于定顺序存储结构实现的赋值、比较、求子的位置、替换等操作。要求所有操作均以函数的形式实现,在主函数中调用各个函数实现整体功能。 注意:每一个字符串的第一个元素存放的是该字符串度(不包括第一个元素),除的赋值外,其他所有操作(比较、求子的位置、替换)等都不应包含该字符。 1.1.实验1:赋值函数实现: 按照系统已经定义的函数接口编写函数实体,实现:将输入数组StrInput[]的数据赋值给待赋值数组StrTobeAssigned[],其中待赋值数组StrTobeAssigned[0]存放有效数据度,StrTobeAssigned[1]之后存放带赋值数据。 具体要求和相关假设为: ① 函数接口定义为:int MyStrAssign(char * StrTobeAssigned, char * StrInput); ② 输入参数:待赋值字符串变量StrTobeAssigned,字符串的期望值StrInput; ③ 输出参数:无; ④ 处理规则及返回值:将StrTobeAssigned[1]及之后的内容赋值为StrInput的有效内容,StrTobeAssigned[0]赋值为StrInput有效字符的度,并返回1; ⑤ 假设: a)两个字符串均不为空; b)StrInput存放的是一个完成的字符串(不包含度); c)赞不考虑输入数据超过数组总度的情况。 1.2实验2:替换函数: 按照系统已经定义的函数接口编写函数实体,实现:在主中MainStr查找是否存在某特定子SubStr1,若存在则将所有的SubStr1替换为新的指定子SubStr2,函数返回字符串替换的次数。 具体要求和相关假设为: ① 函数接口定义为:int MyStrReplace(char * MainStr, char * SubStr1, char * SubStr2); ② 输入参数:主变量MainStr,子变量SubStr1,SubStr2; ③ 输出参数:无; ④ 处理规则及返回值:若主中存在子,用SubStr2替换主MainStr中出现的所有与SubStr1相同的不重叠的子,并返回字符串替换的次数;否则返回0。 ⑤ 假设: a)主和两个子均不为空; b)MainStr[0]和SubStr1[0],SubStr2[0]分别存放对应字符串度,不用替换该部分。 2.问题分析 (1)根据实验一的内容可知,我们需要通过编写函数实体的形式实现的赋值操作,主要的思路包括: (a)获得输入字符串度len; (b)将输入字符串度len赋值给待赋值字符串的第一个元素StrTobeAssigned[0]; (c)依次将输入字符串数据赋值给待赋值字符串。 (2)根据实验二的内容可知,我们需要通过编写函数实体的形式实现的替换操作,主要的思路包括: (a)遍历主MainStr,检查是否存在某特定子SubStr1; (b)如果存在则找到子在主中的位置; (c)在主中删除该子并更新主度; (d)在主中插入该子并更新主度; (e)过程中记录替换字符串的次数,遍历结束后返回该次数(如果没有替换则为0); 如果有必要,可以使用本实验已经提供的相关函数,如:求子位置的函数MySubStrIndex(),子删除函数MyStrDelete()和子插入函数MyStrInsert()等
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随风舞落叶殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值