编写完整的C++语言程序完成下列实验任务:定义顺序存储的串类,完成下列各功能(要求不能使用strcmp、strcpy等等库函数来直接实现): 1、求子串。返回从主串s的第i个字符开始长为len的子串。 主串s的值、i、len等值均自定。要求有结果输出。
时间: 2024-11-12 08:31:38 浏览: 19
c++_按顺序输出字符串_
在C++中编写一个顺序存储字符串类(String)来完成这个实验任务,我们可以创建一个包含私有数据成员(字符数组)、构造函数、赋值操作符以及用于获取子串的方法。这里不使用库函数如`strcmp`或`strcpy`,而是手动实现字符串的比较和复制。
首先,定义一个基本的顺序存储字符串类(假设名字为`SequentialString`),并实现相关的成员:
```cpp
#include <iostream>
#include <cstring>
class SequentialString {
private:
char* data;
int length;
public:
// 构造函数
SequentialString(const char* s) : data(new char[strlen(s) + 1]), length = strlen(s) {
std::copy(s, s + length, data);
data[length] = '\0'; // 添加终止符
}
// 自动调整大小的拷贝构造函数
SequentialString(const SequentialString& other) {
if (other.length > 0) {
data = new char[other.length + 1];
std::copy(other.data, other.data + other.length, data);
data[other.length] = '\0';
length = other.length;
}
}
~SequentialString() { delete[] data; } // 析构函数
// 赋值运算符
SequentialString& operator=(const SequentialString& other) {
if (this != &other) {
delete[] data;
if (other.length > 0) {
data = new char[other.length + 1];
std::copy(other.data, other.data + other.length, data);
data[other.length] = '\0';
length = other.length;
} else {
data = nullptr;
length = 0;
}
}
return *this;
}
// 获取子串(不使用strcmp)
SequentialString getSubStr(int i, int len) const {
if (i >= 0 && i < length && i + len <= length) {
SequentialString subStr;
subStr.data = data + i;
subStr.length = len;
return subStr;
} else {
std::cerr << "Invalid index or length for substring." << std::endl;
return SequentialString(); // 返回空串
}
}
// 打印字符串
void print() const {
std::cout << data << std::endl;
}
};
int main() {
SequentialString str("Hello, World!");
str.print();
SequentialString substr = str.getSubStr(7, 5); // 求 "World" 子串
substr.print();
return 0;
}
```
在这个例子中,我们创建了一个顺序存储的字符串类,它有自己的内存管理,并实现了子串的获取方法。注意,在`getSubStr`函数里,我们检查了索引是否有效,如果索引超出范围则打印错误信息并返回空串。
阅读全文