📄 string.cc
字号:
} ncopy0(&(s[si]), &(x[xi]), remaining); nrep->len = xi + remaining; if (nrep->len <= rep->sz) // fit back in if possible { rep->len = nrep->len; ncopy0(nrep->s, rep->s, rep->len); delete(nrep); } else { delete(rep); rep = nrep; } return nmatches;}/* * deletion */void String::del(int pos, int len){ if (pos < 0 || len <= 0 || (unsigned)(pos + len) > length()) return; int nlen = length() - len; int first = pos + len; ncopy0(&(rep->s[first]), &(rep->s[pos]), length() - first); rep->len = nlen;}void String::del(const Regex& r, int startpos){ int mlen; int first = r.search(chars(), length(), mlen, startpos); del(first, mlen);}void String::del(const char* t, int startpos){ int tlen = slen(t); int p = search(startpos, length(), t, tlen); del(p, tlen);}void String::del(const String& y, int startpos){ del(search(startpos, length(), y.chars(), y.length()), y.length());}void String::del(const SubString& y, int startpos){ del(search(startpos, length(), y.chars(), y.length()), y.length());}void String::del(char c, int startpos){ del(search(startpos, length(), c), 1);}/* * substring extraction */SubString String::at(int first, int len){ return _substr(first, len);}SubString String::operator() (int first, int len){ return _substr(first, len);}SubString String::before(int pos){ return _substr(0, pos);}SubString String::through(int pos){ return _substr(0, pos+1);}SubString String::after(int pos){ return _substr(pos + 1, length() - (pos + 1));}SubString String::from(int pos){ return _substr(pos, length() - pos);}SubString String::at(const String& y, int startpos){ int first = search(startpos, length(), y.chars(), y.length()); return _substr(first, y.length());}SubString String::at(const SubString& y, int startpos){ int first = search(startpos, length(), y.chars(), y.length()); return _substr(first, y.length());}SubString String::at(const Regex& r, int startpos){ int mlen; int first = r.search(chars(), length(), mlen, startpos); return _substr(first, mlen);}SubString String::at(const char* t, int startpos){ int tlen = slen(t); int first = search(startpos, length(), t, tlen); return _substr(first, tlen);}SubString String::at(char c, int startpos){ int first = search(startpos, length(), c); return _substr(first, 1);}SubString String::before(const String& y, int startpos){ int last = search(startpos, length(), y.chars(), y.length()); return _substr(0, last);}SubString String::before(const SubString& y, int startpos){ int last = search(startpos, length(), y.chars(), y.length()); return _substr(0, last);}SubString String::before(const Regex& r, int startpos){ int mlen; int first = r.search(chars(), length(), mlen, startpos); return _substr(0, first);}SubString String::before(char c, int startpos){ int last = search(startpos, length(), c); return _substr(0, last);}SubString String::before(const char* t, int startpos){ int tlen = slen(t); int last = search(startpos, length(), t, tlen); return _substr(0, last);}SubString String::through(const String& y, int startpos){ int last = search(startpos, length(), y.chars(), y.length()); if (last >= 0) last += y.length(); return _substr(0, last);}SubString String::through(const SubString& y, int startpos){ int last = search(startpos, length(), y.chars(), y.length()); if (last >= 0) last += y.length(); return _substr(0, last);}SubString String::through(const Regex& r, int startpos){ int mlen; int first = r.search(chars(), length(), mlen, startpos); if (first >= 0) first += mlen; return _substr(0, first);}SubString String::through(char c, int startpos){ int last = search(startpos, length(), c); if (last >= 0) last += 1; return _substr(0, last);}SubString String::through(const char* t, int startpos){ int tlen = slen(t); int last = search(startpos, length(), t, tlen); if (last >= 0) last += tlen; return _substr(0, last);}SubString String::after(const String& y, int startpos){ int first = search(startpos, length(), y.chars(), y.length()); if (first >= 0) first += y.length(); return _substr(first, length() - first);}SubString String::after(const SubString& y, int startpos){ int first = search(startpos, length(), y.chars(), y.length()); if (first >= 0) first += y.length(); return _substr(first, length() - first);}SubString String::after(char c, int startpos){ int first = search(startpos, length(), c); if (first >= 0) first += 1; return _substr(first, length() - first);}SubString String::after(const Regex& r, int startpos){ int mlen; int first = r.search(chars(), length(), mlen, startpos); if (first >= 0) first += mlen; return _substr(first, length() - first);}SubString String::after(const char* t, int startpos){ int tlen = slen(t); int first = search(startpos, length(), t, tlen); if (first >= 0) first += tlen; return _substr(first, length() - first);}SubString String::from(const String& y, int startpos){ int first = search(startpos, length(), y.chars(), y.length()); return _substr(first, length() - first);}SubString String::from(const SubString& y, int startpos){ int first = search(startpos, length(), y.chars(), y.length()); return _substr(first, length() - first);}SubString String::from(const Regex& r, int startpos){ int mlen; int first = r.search(chars(), length(), mlen, startpos); return _substr(first, length() - first);}SubString String::from(char c, int startpos){ int first = search(startpos, length(), c); return _substr(first, length() - first);}SubString String::from(const char* t, int startpos){ int tlen = slen(t); int first = search(startpos, length(), t, tlen); return _substr(first, length() - first);}/* * split/join */int split(const String& src, String results[], int n, const String& sep){ String x = src; const char* s = x.chars(); int sl = x.length(); int i = 0; int pos = 0; while (i < n && pos < sl) { int p = x.search(pos, sl, sep.chars(), sep.length()); if (p < 0) p = sl; results[i].rep = Salloc(results[i].rep, &(s[pos]), p - pos, p - pos); i++; pos = p + sep.length(); } return i;}int split(const String& src, String results[], int n, const Regex& r){ String x = src; const char* s = x.chars(); int sl = x.length(); int i = 0; int pos = 0; int p, matchlen; while (i < n && pos < sl) { p = r.search(s, sl, matchlen, pos); if (p < 0) p = sl; results[i].rep = Salloc(results[i].rep, &(s[pos]), p - pos, p - pos); i++; pos = p + matchlen; } return i;}#if defined(__GNUG__) && !defined(_G_NO_NRV)#define RETURN(r) return#define RETURNS(r) return r;#define RETURN_OBJECT(TYPE, NAME) /* nothing */#else /* _G_NO_NRV */#define RETURN(r) return r#define RETURNS(r) /* nothing */#define RETURN_OBJECT(TYPE, NAME) TYPE NAME;#endifString join(String src[], int n, const String& separator) RETURNS(x){ RETURN_OBJECT(String,x) int i; String sep = separator; int xlen = 0; for (int i = 0; i < n; ++i) xlen += src[i].length(); xlen += (n - 1) * sep.length(); x.rep = Sresize (x.rep, xlen); int j = 0; for (i = 0; i < n - 1; ++i) { ncopy(src[i].chars(), &(x.rep->s[j]), src[i].length()); j += src[i].length(); ncopy(sep.chars(), &(x.rep->s[j]), sep.length()); j += sep.length(); } ncopy0(src[i].chars(), &(x.rep->s[j]), src[i].length()); RETURN(x);} /* misc*/ StrRep* Sreverse(const StrRep* src, StrRep* dest){ int n = src->len; if (src != dest) dest = Salloc(dest, src->s, n, n); if (n > 0) { char* a = dest->s; char* b = &(a[n - 1]); while (a < b) { char t = *a; *a++ = *b; *b-- = t; } } return dest;}StrRep* Supcase(const StrRep* src, StrRep* dest){ int n = src->len; if (src != dest) dest = Salloc(dest, src->s, n, n); char* p = dest->s; char* e = &(p[n]); for (; p < e; ++p) if (islower(*p)) *p = toupper(*p); return dest;}StrRep* Sdowncase(const StrRep* src, StrRep* dest){ int n = src->len; if (src != dest) dest = Salloc(dest, src->s, n, n); char* p = dest->s; char* e = &(p[n]); for (; p < e; ++p) if (isupper(*p)) *p = tolower(*p); return dest;}StrRep* Scapitalize(const StrRep* src, StrRep* dest){ int n = src->len; if (src != dest) dest = Salloc(dest, src->s, n, n); char* p = dest->s; char* e = &(p[n]); for (; p < e; ++p) { int at_word; if ((at_word = islower(*p))) *p = toupper(*p); else at_word = isupper(*p) || isdigit(*p); if (at_word) { while (++p < e) { if (isupper(*p)) *p = tolower(*p); /* A '\'' does not break a word, so that "Nathan's" stays "Nathan's" rather than turning into "Nathan'S". */ else if (!islower(*p) && !isdigit(*p) && (*p != '\'')) break; } } } return dest;}#if defined(__GNUG__) && !defined(_G_NO_NRV)String replicate(char c, int n) return w;{ w.rep = Sresize(w.rep, n); char* p = w.rep->s; while (n-- > 0) *p++ = c; *p = 0;}String replicate(const String& y, int n) return w{ int len = y.length(); w.rep = Sresize(w.rep, n * len); char* p = w.rep->s; while (n-- > 0) { ncopy(y.chars(), p, len); p += len; } *p = 0;}String common_prefix(const String& x, const String& y, int startpos) return r;{ int l; const char* xchars = x.chars(); const char* ychars = y.chars(); const char* xs = &(xchars[startpos]); const char* ss = xs; const char* topx = &(xchars[x.length()]); const char* ys = &(ychars[startpos]); const char* topy = &(ychars[y.length()]); for (l = 0; xs < topx && ys < topy && *xs++ == *ys++; ++l); r.rep = Salloc(r.rep, ss, l, l);}String common_suffix(const String& x, const String& y, int startpos) return r;{ int l; const char* xchars = x.chars(); const char* ychars = y.chars(); const char* xs = &(xchars[x.length() + startpos]); const char* botx = xchars; const char* ys = &(ychars[y.length() + startpos]); const char* boty = ychars; for (l = 0; xs >= botx && ys >= boty && *xs == *ys ; --xs, --ys, ++l); r.rep = Salloc(r.rep, ++xs, l, l);}#elseString replicate(char c, int n){ String w; w.rep = Sresize(w.rep, n); char* p = w.rep->s; while (n-- > 0) *p++ = c; *p = 0; return w;}String replicate(const String& y, int n){ String w; int len = y.length(); w.rep = Sresize(w.rep, n * len); char* p = w.rep->s; while (n-- > 0) { ncopy(y.chars(), p, len); p += len; } *p = 0; return w;}String common_prefix(const String& x, const String& y, int startpos){ String r; const char* xchars = x.chars(); const char* ychars = y.chars(); const char* xs = &(xchars[startpos]); const char* ss = xs; const char* topx = &(xchars[x.length()]); const char* ys = &(ychars[startpos]); const char* topy = &(ychars[y.length()]); for (int l = 0; xs < topx && ys < topy && *xs++ == *ys++; ++l); r.rep = Salloc(r.rep, ss, l, l); return r;}String common_suffix(const String& x, const String& y, int startpos) { String r; const char* xchars = x.chars(); const char* ychars = y.chars(); const char* xs = &(xchars[x.length() + startpos]); const char* botx = xchars; const char* ys = &(ychars[y.length() + startpos]); const char* boty = ychars; for (int l = 0; xs >= botx && ys >= boty && *xs == *ys ; --xs, --ys, ++l); r.rep = Salloc(r.rep, ++xs, l, l); return r;}#endif// IOistream& operator>>(istream& s, String& x){ if (!s.ipfx(0) || (!(s.flags() & ios::skipws) && !ws(s))) { s.clear(ios::failbit|s.rdstate()); // Redundant if using GNU iostreams. return s; } int ch; int i = 0; x.rep = Sresize(x.rep, 20); register streambuf *sb = s.rdbuf(); while ((ch = sb->sbumpc()) != EOF) { if (isspace(ch)) break; if (i >= x.rep->sz - 1) x.rep = Sresize(x.rep, i+1); x.rep->s[i++] = ch; } x.rep->s[i] = 0; x.rep->len = i; int new_state = s.rdstate(); if (i == 0) new_state |= ios::failbit; if (ch == EOF) new_state |= ios::eofbit; s.clear(new_state); return s;}int readline(istream& s, String& x, char terminator, int discard){ if (!s.ipfx(0)) return 0; int ch; int i = 0; x.rep = Sresize(x.rep, 80); register streambuf *sb = s.rdbuf(); while ((ch = sb->sbumpc()) != EOF) { if (ch != terminator || !discard) { if (i >= x.rep->sz - 1) x.rep = Sresize(x.rep, i+1); x.rep->s[i++] = ch; } if (ch == terminator) break; } x.rep->s[i] = 0; x.rep->len = i; if (ch == EOF) s.clear(ios::eofbit|s.rdstate()); return i;}ostream& operator<<(ostream& s, const SubString& x){ const char* a = x.chars(); const char* lasta = &(a[x.length()]); while (a < lasta) s.put(*a++); return(s);}// from John.Willis@FAS.RI.CMU.EDUint String::freq(const SubString& y) const{ int found = 0; for (unsigned int i = 0; i < length(); i++) if (match(i,length(),0,y.chars(), y.length())>= 0) found++; return(found);}int String::freq(const String& y) const{ int found = 0; for (unsigned int i = 0; i < length(); i++) if (match(i,length(),0,y.chars(),y.length()) >= 0) found++; return(found);}int String::freq(const char* t) const{ int found = 0; for (unsigned int i = 0; i < length(); i++) if (match(i,length(),0,t) >= 0) found++; return(found);}int String::freq(char c) const{ int found = 0; for (unsigned int i = 0; i < length(); i++) if (match(i,length(),0,&c,1) >= 0) found++; return(found);}int String::OK() const{ if (rep == 0 // don't have a rep || rep->len > rep->sz // string oustide bounds || rep->s[rep->len] != 0) // not null-terminated error("invariant failure"); return 1;}int SubString::OK() const{ int v = S != (const char*)0; // have a String; v &= S.OK(); // that is legal v &= pos + len >= S.rep->len;// pos and len within bounds if (!v) S.error("SubString invariant failure"); return v;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -