定义一个字符串类str,该类中包含2个属性,字符串长度和一个char型指针保存字符串内容。增加以下运算符的重载:+、- 。+运算符表示把2个字符串拼接成一个字符串。-运算符表示例如a2-a1,则删除a2中出现的a1字符串。 要求如下: 1.实现str类; 2.编写main函数,初始化2个str对象A、B,输出这2个对象相加后的对象C的结果信息。输出C与B之间相减后的结果信息。 (提示:strstr(char *a,char*b)可以从a字符串中查找出b首次出现的地址)
时间: 2023-11-28 08:47:13 浏览: 57
以下是一个可能的实现:
```cpp
#include <iostream>
#include <cstring>
using namespace std;
class str {
private:
int len;
char *content;
public:
str() : len(0), content(nullptr) {}
str(const char *s) : len(strlen(s)), content(new char[len + 1]) {
strcpy(content, s);
}
str(const str &other) : len(other.len), content(new char[len + 1]) {
strcpy(content, other.content);
}
~str() {
delete[] content;
}
str operator+(const str &other) const {
char *new_content = new char[len + other.len + 1];
strcpy(new_content, content);
strcat(new_content, other.content);
return str(new_content);
}
str operator-(const str &other) const {
char *pos = strstr(content, other.content);
if (pos == nullptr) {
return str(content);
} else {
char *new_content = new char[len - other.len + 1];
strncpy(new_content, content, pos - content);
new_content[pos - content] = '\0';
strcat(new_content, pos + other.len);
return str(new_content);
}
}
friend ostream &operator<<(ostream &out, const str &s) {
out << s.content;
return out;
}
};
int main() {
str A("Hello, "), B("world!");
str C = A + B;
cout << C << endl; // Hello, world!
str D = C - B;
cout << D << endl; // Hello,
return 0;
}
```
在这个实现中,我们使用了动态内存分配来保存字符串内容。在 `operator+` 中,我们新建了一个 char 数组,把两个字符串的内容拷贝到这个数组中,然后返回一个新的 str 对象。在 `operator-` 中,我们使用了 `strstr` 函数来查找子串的位置,然后根据位置进行字符串的删除操作。需要注意的是,`strncpy` 函数需要手动在末尾添加一个 `\0` 字符,因为它不会自动添加。
阅读全文