1、子串查找(KMP 算法的直接应用)
int indexOf(const char* s)const;
int indexOf(const String& s)const;
int String::indexOf(const char* s)const
{
return kmp(m_str, s ? s : "");
}
int String::indexOf(const String& s)const
{
return kmp(m_str, s.m_str);
}
#include <iostream>
#include "XiebsString.h"
using namespace std;
using namespace XiebsLib;
int main()
{
String s = "ababax";
cout << s.indexOf("bax") << endl;
return 0;
}
2、在字符串中将指定的子串删除
String& remove(int i, int len);
String& remove(const char* s);
String& remove(const String& s);
String& String::remove(int i, int len)
{
if( (0 <= i) && (i < m_length) )
{
int n = i;
int m = i + len;
while( (n < m) && (m < m_length) )
{
m_str[n++] = m_str[m++];
}
m_str[n] = '\0';
m_length = n;
}
return *this;
}
String& String::remove(const char* s)
{
return remove(indexOf(s), s ? strlen(s) : 0);
}
String& String::remove(const String& s)
{
return remove(indexOf(s), s.length());
}
#include <iostream>
#include "XiebsString.h"
using namespace std;
using namespace XiebsLib;
int main()
{
String s = "ababax";
cout << s.remove("bab").str() << endl;
return 0;
}
3、字符串的减法操作定义(operator -)
String operator -(const String& s)const;
String operator -(const char* s)const;
String& operator -=(const String& s);
String& operator -=(const char* s);
String String::operator -(const String& s)const
{
return String(*this).remove(s);
}
String String::operator -(const char* s)const
{
return String(*this).remove(s);
}
String& String::operator -=(const String& s)
{
return remove(s);
}
String& String::operator -=(const char* s)
{
return remove(s);
}
#include <iostream>
#include "XiebsString.h"
using namespace std;
using namespace XiebsLib;
int main()
{
String s = "ababax";
String s1 = s - "bax";
cout << s.str() << endl;
cout << s1.str() << endl;
s -= s;
cout << "[" << s.str() << "]" << endl;
return 0;
}
4、字符串中的子串替换
String& replace(const char* t, const char* s);
String& replace(const String& t, const char* s);
String& replace(const char* t, const String& s);
String& replace(const String& t, const String& s);
String& String::replace(const char* t, const char* s)
{
int index = indexOf(t);
if(index > 0)
{
remove(t);
insert(index, s);
}
return *this;
}
String& String::replace(const String& t, const char* s)
{
replace(t.m_str, s);
}
String& String::replace(const char* t, const String& s)
{
replace(t, s.m_str);
}
String& String::replace(const String& t, const String& s)
{
replace(t.m_str, s.m_str);
}
#include <iostream>
#include "XiebsString.h"
using namespace std;
using namespace XiebsLib;
int main()
{
String s = "ababax";
s.replace("baba", "xyz");
cout << s.str() << endl;
return 0;
}
5、从字符串中创建子串
String sub(int i, int len) const;
String String::sub(int i, int len) const
{
String ret;
if( (0 <= i) && (i < m_length) )
{
if( len < 0 ) len = 0;
if( len > m_length ) len = m_length - i;
char* str = static_cast<char*>(malloc(len + 1));
strncpy(str, m_str + i, len);
str[len] = '\0';
ret = str;
}
else
{
THROW_EXCEPTION(IndexOutOfBoundsException, "Parameter i is invalid ...");
}
return ret;
}
#include <iostream>
#include "XiebsString.h"
using namespace std;
using namespace XiebsLib;
int main()
{
String s = "ababax";
String s1 = s.sub(3, 10);
String s2 = s.sub(2, 3);
cout << s.str() << endl;
cout << s1.str() << endl;
cout << s2.str() << endl;
return 0;
}