编一道程序分别求定长顺序串的复制,定长顺序串的长度、连接,定长顺序串求子串,定长顺序串的定位,插入、删除、替换,定长顺序串的比较。
时间: 2023-10-28 10:06:16 浏览: 37
以下是一个 C++ 实现的定长顺序串类,包含了所需的各种操作:
```cpp
#include <iostream>
#include <cstring>
using namespace std;
class FixedString {
private:
char *data; // 存储串的数组
int length; // 串的长度
public:
// 构造函数
FixedString(int length = 0) {
this->length = length;
data = new char[length + 1];
memset(data, 0, length + 1);
}
// 复制函数
FixedString(const FixedString &str) {
length = str.length;
data = new char[length + 1];
memcpy(data, str.data, length + 1);
}
// 析构函数
~FixedString() {
delete[] data;
}
// 获取串的长度
int getLength() const {
return length;
}
// 获取指定位置的字符
char getChar(int index) const {
if (index >= 0 && index < length) {
return data[index];
} else {
throw "Invalid index";
}
}
// 设置指定位置的字符
void setChar(int index, char c) {
if (index >= 0 && index < length) {
data[index] = c;
} else {
throw "Invalid index";
}
}
// 连接两个串
FixedString concat(const FixedString &str) const {
FixedString newStr(length + str.length);
memcpy(newStr.data, data, length);
memcpy(newStr.data + length, str.data, str.length);
return newStr;
}
// 获取子串
FixedString substr(int start, int len) const {
if (start >= 0 && start < length && len >= 0 && start + len <= length) {
FixedString newStr(len);
memcpy(newStr.data, data + start, len);
return newStr;
} else {
throw "Invalid start or length";
}
}
// 定位子串
int indexOf(const FixedString &str) const {
for (int i = 0; i < length - str.length + 1; i++) {
bool found = true;
for (int j = 0; j < str.length; j++) {
if (data[i + j] != str.data[j]) {
found = false;
break;
}
}
if (found) {
return i;
}
}
return -1;
}
// 插入子串
FixedString insert(int index, const FixedString &str) const {
if (index >= 0 && index <= length) {
FixedString newStr(length + str.length);
memcpy(newStr.data, data, index);
memcpy(newStr.data + index, str.data, str.length);
memcpy(newStr.data + index + str.length, data + index, length - index);
return newStr;
} else {
throw "Invalid index";
}
}
// 删除子串
FixedString remove(int start, int len) const {
if (start >= 0 && start < length && len >= 0 && start + len <= length) {
FixedString newStr(length - len);
memcpy(newStr.data, data, start);
memcpy(newStr.data + start, data + start + len, length - start - len);
return newStr;
} else {
throw "Invalid start or length";
}
}
// 替换子串
FixedString replace(const FixedString &oldStr, const FixedString &newStr) const {
FixedString result(*this);
int index = 0;
while ((index = result.indexOf(oldStr)) != -1) {
result = result.remove(index, oldStr.length);
result = result.insert(index, newStr);
}
return result;
}
// 比较两个串
bool equals(const FixedString &str) const {
if (length != str.length) {
return false;
}
for (int i = 0; i < length; i++) {
if (data[i] != str.data[i]) {
return false;
}
}
return true;
}
};
int main() {
FixedString str1(10);
FixedString str2(10);
str1.setChar(0, 'H');
str1.setChar(1, 'e');
str1.setChar(2, 'l');
str1.setChar(3, 'l');
str1.setChar(4, 'o');
str2.setChar(0, 'W');
str2.setChar(1, 'o');
str2.setChar(2, 'r');
str2.setChar(3, 'l');
str2.setChar(4, 'd');
// 复制
FixedString str3(str1);
// 长度
cout << "Length of str1: " << str1.getLength() << endl;
// 连接
FixedString str4 = str1.concat(str2);
cout << "Concatenation of str1 and str2: " << str4.getChar(0) << str4.getChar(1) << str4.getChar(2)
<< str4.getChar(3) << str4.getChar(4) << str4.getChar(5) << str4.getChar(6) << str4.getChar(7)
<< str4.getChar(8) << str4.getChar(9) << str4.getChar(10) << str4.getChar(11) << str4.getChar(12)
<< str4.getChar(13) << endl;
// 子串
FixedString str5 = str1.substr(1, 3);
cout << "Substring of str1: " << str5.getChar(0) << str5.getChar(1) << str5.getChar(2) << endl;
// 定位
cout << "Index of \"llo\" in str1: " << str1.indexOf(FixedString(3).setChar(0, 'l').setChar(1, 'l').setChar(2, 'o')) << endl;
// 插入
FixedString str6 = str1.insert(2, FixedString(3).setChar(0, 'L').setChar(1, 'O').setChar(2, '!'));
cout << "Insertion to str1: " << str6.getChar(0) << str6.getChar(1) << str6.getChar(2) << str6.getChar(3)
<< str6.getChar(4) << str6.getChar(5) << str6.getChar(6) << str6.getChar(7) << str6.getChar(8)
<< str6.getChar(9) << endl;
// 删除
FixedString str7 = str1.remove(2, 2);
cout << "Deletion from str1: " << str7.getChar(0) << str7.getChar(1) << str7.getChar(2) << str7.getChar(3) << endl;
// 替换
FixedString str8 = str1.replace(FixedString(2).setChar(0, 'l').setChar(1, 'o'), FixedString(3).setChar(0, 'X').setChar(1, 'Y').setChar(2, 'Z'));
cout << "Replacement in str1: " << str8.getChar(0) << str8.getChar(1) << str8.getChar(2) << str8.getChar(3)
<< str8.getChar(4) << str8.getChar(5) << str8.getChar(6) << str8.getChar(7) << endl;
// 比较
cout << "Comparison of str1 and str2: " << (str1.equals(str2) ? "Equal" : "Not equal") << endl;
cout << "Comparison of str1 and str3: " << (str1.equals(str3) ? "Equal" : "Not equal") << endl;
return 0;
}
```
这个程序实现了定长顺序串的复制、长度、连接、子串、定位、插入、删除、替换和比较等操作。你可以根据需要调用其中的函数来进行操作。