按要求完成图片中的实验,并将代码图片以及运行结果发出,若嫌麻烦可加价。最好是今天晚上之前完成!时间比较紧!
2条回答 默认 最新
- 技术专家团-小桥流水 2022-04-29 13:57关注
模拟实现string的操作。运行结果:
#include <iostream> using namespace std; class MyString { //(1) private: char* mPtr; //字符指针 public: //(2)对私有变量的读写 char* getPtr() { return mPtr; } void setPtr( char* p) { mPtr = p; } //这里是浅拷贝 //(3)3个构造函数 MyString() { mPtr = 0; } MyString(const char* p) { int len = 0; int i = 0; while (p[len] != '\0') { len++; } mPtr = new char[len + 1]; while (p[i] != '\0') { mPtr[i] = p[i]; i++; } mPtr[i] = '\0'; } MyString(int n) { mPtr = new char[n]; } //(4)拷贝构造函数 MyString(MyString& s) { if (mPtr) { delete[] mPtr; } int len = 0; int i = 0; while (s.mPtr[len] != '\0') { len++; } mPtr = new char[len + 1]; while (s.mPtr[i] != '\0') { mPtr[i] = s.mPtr[i]; i++; } mPtr[i] = '\0'; } //赋值运算符重载 void operator=(const MyString& s) { if (mPtr) { delete[] mPtr; } int len = 0; int i = 0; while (s.mPtr[len] != '\0') { len++; } mPtr = new char[len + 1]; while (s.mPtr[i] != '\0') { mPtr[i] = s.mPtr[i]; i++; } mPtr[i] = '\0'; } //(5)析构函数 ~MyString() { if (mPtr != 0) { delete[] mPtr; mPtr = 0; } } //(6)求字符串长度 int length() { int len=0; if (mPtr == 0) return 0; while (mPtr[len] != '\0') len++; return len; } //(7)字符串拷贝 void copy(MyString &p) { if (mPtr != 0) { delete[] mPtr; } int len = 0; int i = 0; while (p.mPtr[len] != '\0') { len++; } mPtr = new char[len + 1]; while (p.mPtr[i] != '\0') { mPtr[i] = p.mPtr[i]; i++; } mPtr[i] = '\0'; } //或者直接拷贝char* void copy(const char* p) { int len = 0; int i = 0; if (mPtr != 0) { delete[] mPtr; } while (p[len] != '\0') { len++; } mPtr = new char[len + 1]; while (p[i] != '\0') { mPtr[i] = p[i]; i++; } mPtr[i] = '\0'; } //(8)字符串查找 int find(const char* p) { int i = 0; int j = 0; if (mPtr == 0) return -1; for (i = 0; mPtr[i] != '\0'; i++) { for (j = 0; p[j] != '\0'; j++) { if (mPtr[i + j] == p[j]) continue; else break; } if (p[j] == '\0') return i; } return -1; } //(9)插入 char* insert(int pos, const char* p) { int len = length(); //计算当前串的长度 int l2 = 0; if (pos < 0 || p == 0) return mPtr; if (pos >= len) return mPtr; //位置错误 while (p[l2]) { l2++; } if (len == 0 || mPtr == 0) { mPtr = new char[l2 + 1]; int i = 0; while (p[i]) { mPtr[i] = p[i]; i++; } mPtr[i] = 0; return mPtr; } // char* ptmp = new char[len + l2 + 1]; int k = 0; int j = 0; //复制pos之前的数据 for (k = 0; k < pos; k++) ptmp[k] = mPtr[k]; //复制p中的数据 for (j = 0; p[j] != '\0'; j++) { ptmp[k] = p[j]; k++; } //复制pos之后的数据 for (j = 0; mPtr[j + pos] != '\0'; j++) { ptmp[k] = mPtr[j + pos]; k++; } ptmp[k] = 0; //释放原来的空间 delete[] mPtr; mPtr = ptmp; ptmp = 0; return mPtr; } }; //(10) int main() { const char* p = "abcde"; const char* p2 = "1234567890"; //3种构造方法 MyString s1; MyString s2(p); MyString s3(10); //拷贝构造函数 MyString s4(s2); //赋值运算符 MyString s5; s5 = s4; cout << s5.getPtr() <<"的长度为:" << s5.length() << endl; //输出s5的长度 //调用拷贝函数 s5.copy(p2); cout << "调用copy函数拷贝1234567890后,s5的内容:" << s5.getPtr() << endl; //输出拷贝后的字符串 int index = s5.find("00"); if (index == -1) cout << "00不在" << s5.getPtr() << "中" << endl; else cout << "00在" << s5.getPtr() << "的下标:" << index << endl; index = s5.find("234"); if (index == -1) cout << "234不在" << s5.getPtr() << "中" << endl; else cout << "234在" << s5.getPtr() << "的下标:" << index << endl; //插入 cout << s5.getPtr() << "在下标2处插入xxx后的字符串是:"; const char* p3 = "xxx"; cout << s5.insert(2, p3) << endl; return 0; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥15 想问一下树莓派接上显示屏后出现如图所示画面,是什么问题导致的
- ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
- ¥15 cmd cl 0x000007b
- ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
- ¥500 火焰左右视图、视差(基于双目相机)
- ¥100 set_link_state
- ¥15 虚幻5 UE美术毛发渲染
- ¥15 CVRP 图论 物流运输优化
- ¥15 Tableau online 嵌入ppt失败
- ¥100 支付宝网页转账系统不识别账号