赞
踩
代码如下:
#include <iostream> #include <string> using namespace std; typedef struct { char *ch; int length; }String; bool initString(String &s) { s.ch = nullptr; s.length = 0; return true; } bool strAssign(String &s, const char *ch) { int len = strlen(ch); s.ch = new char[len + 1]; if (!s.ch) return false; for (int i = 0; i < len; i++) { s.ch[i] = ch[i]; } s.ch[len] = '\0'; s.length = len; return true; } bool strCopy(String &s, String t) { if (!t.ch) return false; if (s.ch) delete[] s.ch; int len = strlen(t.ch); s.ch = new char[len + 1]; for (int i = 0; i < len; i++) { s.ch[i] = t.ch[i]; } s.ch[len] = '\0'; s.length = len; return true; } bool strEmpty(String s) { if (s.ch && s.length == 0) return true; return false; } bool strCompare(String s, String ss) { if (!s.ch) return false; if (!ss.ch) return false; for (int i = 0; i < s.length && i < ss.length; i++) { if (s.ch[i] != ss.ch[i]) { return s.ch[i] - ss.ch[i]; } } return s.length - ss.length; } int strLength(String s) { return s.length; } bool clearString(String &s) { s.length = 0; return true; } bool concatString(String &s, String s1, String s2) { if (s.ch) delete[] s.ch; int len1 = s1.length; int len2 = s2.length; int len3 = len1 + len2; s.ch = new char[len3 + 1]; for (int i = 0; i < len1; i++) { s.ch[i] = s1.ch[i]; } for (int i = len1; i < len3; i++) { s.ch[i] = s2.ch[i]; } s.ch[len3] = '\0'; s.length = len3; return true; } bool subString(String &sub, String s, int pos, int len) { if (!s.ch) return false; if (pos <1 || pos > s.length || len < 0 || len > s.length - pos + 1) return false; if (sub.ch) delete[] sub.ch; if (!len) { sub.ch = nullptr; sub.length = 0; } else { sub.ch = new char[len + 1]; for (int i = 0; i < len; i++) { sub.ch[i] = s.ch[pos - 1 + i]; } sub.ch[len] = '\0'; sub.length = len; } return true; } int indexString(String s, String ss, int pos) { if (pos > 0) { int n = s.length; int m = ss.length; int i = pos; String sub; initString(sub); while (i <= n - m + 1) { subString(sub, s, i, m); if (strCompare(sub, ss) != 0) ++i; else return i; } } return false; } bool strInsert(String &s, int pos, String t) { if (t.ch && s.ch) { int len1 = t.length; int len2 = s.length; int len3 = len1 + len2; char *p = new char[len3 + 1]; if (!p) return false; for (int i = 0; i < pos - 1 && i < len3; i++) { p[i] = s.ch[i]; } for (int i = 0; i < len1 && pos - 1 + i; i++) { p[pos - 1 + i] = t.ch[i]; } for (int i = 0; i < len3 - pos + 1 && pos + len1 - 1 + i < len3; i++)//pos + len1 - 1 + i < len3,防止数组越界,导致无法成功释放内存(数组越界以后,delete无法成功释放内存) { p[pos + len1 - 1 + i] = s.ch[pos - 1 + i]; } p[len3] = '\0'; delete[] s.ch; s.ch = nullptr; s.ch = p; s.length = len3; return true; } return false; } bool strDelete(String &s, int pos, int len) { if (pos >= s.length) return false; if (pos + len >= s.length) { s.length = len; s.ch[len] = '\0'; } else { int start = pos + len - 1; while (start <= s.length) { s.ch[pos - 1] = s.ch[start]; ++start; ++pos; } s.length -= len; } return true; } bool replaceString(String &s, String t, String v) { int len_s = s.length; int len_t = t.length; int len_v = v.length; int j = 1; String sub; initString(sub); while (len_s - j + 1 >= len_t) { subString(sub, s, j, len_t); if (strCompare(sub, t) == 0) { strDelete(s, j, len_t); strInsert(s, j, v); j += len_v; s.length = s.length + len_v - len_t; len_s = s.length; } else { j++; } } return true; } bool destroyString(String &s) { if (s.ch) { delete[]s.ch; s.length = 0; } return true; } int main() { const char *ch = "dasfas"; String s1; const char *ch1 = "dadas"; String s2; const char *ch2 = "as"; String s3; strAssign(s3, ch2); strAssign(s2, ch1); strAssign(s1, ch); strInsert(s1, 4, s2); strDelete(s1, 4, 5); cout << s1.ch << endl; cout << s2.ch << endl; replaceString(s1, s3, s2); cout << s1.ch << endl; String s4; initString(s4); strCopy(s4, s1); cout << s4.ch << endl; return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。