文章目录
串的基本概念
1.串长:串的长度(字符个数)称作串长。
2.空串:长度为0的字符串。
3.主串:包含所有子串的串为主串。
4.子串:串中任意连续的字符组成的子序列称为该串的子串。
串的相关操作
串的操作有生成串,复制串,串连接,求串长,求子串位置,求子串,串比较,插入串,删除串,打印串等等。
串的代码与运行结果
string的结构体:
typedef struct String {
char ch[MaxSize + 1];//'\0'
int len;
}String;
初始化string:
void InitString(String& s) {
s.len = 0;
s.ch[0] = '\0';
}
创造string:
void CreateSting(String& s) {
cin.getline(s.ch, MaxSize + 1);//cin会在读取空格时终止
int i = 0;
while (s.ch[i++] != '\0') {
s.len++;
}
}
复制string:
void CopyString(String& s1, String& s2) {
int i = 0;
for (int i = 0; i < s2.len; i++) {
s1.ch[i] = s2.ch[i];
}
s1.len = s2.len;
s1.ch[s1.len] = '\0';
}
拼接string:
String ConcatString(String& s1, String& s2) {
String s;
InitString(s);
int i = 0;
for (i = 0; i < s1.len; i++) {
s.ch[i] = s1.ch[i];
}
for (int j = 0; j < s2.len; j++) {
s.ch[i + j] = s2.ch[j];
}
s.len = s1.len + s2.len;
s.ch[s.len] = '\0';
return s;
}
获取长度:
int GetLen(String& s) {
int length = 0;
int i = 0;
while (s.ch[i] != '\0') {
length++;
i++;
}
return length;
}
寻找子串位置:
int GetSubstringPos(String& s1, String& s2) {
if (s2.len > s1.len) {
return 0;
}
for (int i = 0; i < s1.len-s2.len; i++) {
for (int j = 0; j < s2.len; j++) {
if (s1.ch[i + j] != s2.ch[j]) {
break;
}
if (j==s2.len-1) {
return 1;
}
}
}
return 0;
}
比较string:
int CmpString(String& s1, String& s2) {
int mins = min(s1.len, s2.len);
for (int i = 0; i < mins; i++) {
if (s1.ch[i] > s2.ch[i]) {
return 1;
}
if (s1.ch[i] < s2.len) {
return -1;
}
}
if (s1.len == s2.len) {
return 0;
}
if (s1.len > s2.len) {
return 1;
}
return -1;
}
插入串:
String InsertString(String& s1, String& s2, int pos) {
String S;
InitString(S);
if (pos<=0 || pos>s1.len+1) {
cout << "Conduct error" << endl;
return S;
}
int i = 0;
for (i; i < pos-1; i++) {
S.ch[i] = s1.ch[i];
}
int j = i;
int k = 0;
for (j; j < i + s2.len; j++) {
S.ch[j] = s2.ch[k++];
}
for (j; j < s1.len + s2.len; j++) {
S.ch[j] = s1.ch[i++];
}
S.len = s1.len + s2.len;
S.ch[S.len] = '\0';
return S;
}
删除串:
String DeleteString(String& s, int pos,int len ) {
String S;
InitString(S);
if (pos<1 || pos>s.len||pos+len-1>s.len) {
cout << "Conduct error" << endl;
return S;
}
int index = pos - 1;
int i;
for ( i = 0; i < index; i++) {
S.ch[i] = s.ch[i];
}
int j = i;
for (i+=len;i<s.len;i++) {
S.ch[j++] = s.ch[i];
}
S.len = j;
S.ch[S.len] = '\0';
return S;
}
打印串:
void PrintString(String& s) {
for (int i = 0; i < s.len; i++) {
cout << s.ch[i] ;
}
cout << endl;
}
完整代码如下:
#include<iostream>
#define MaxSize 100
using namespace std;
typedef struct String {
char ch[MaxSize + 1];//'\0'
int len;
}String;
void InitString(String& s) {
s.len = 0;
s.ch[0] = '\0';
}
void CreateSting(String& s) {
cin.getline(s.ch, MaxSize + 1);//cin会在读取空格时终止
int i = 0;
while (s.ch[i++] != '\0') {
s.len++;
}
}
void CopyString(String& s1, String& s2) {
int i = 0;
for (int i = 0; i < s2.len; i++) {
s1.ch[i] = s2.ch[i];
}
s1.len = s2.len;
s1.ch[s1.len] = '\0';
}
String ConcatString(String& s1, String& s2) {
String s;
InitString(s);
int i = 0;
for (i = 0; i < s1.len; i++) {
s.ch[i] = s1.ch[i];
}
for (int j = 0; j < s2.len; j++) {
s.ch[i + j] = s2.ch[j];
}
s.len = s1.len + s2.len;
s.ch[s.len] = '\0';
return s;
}
int GetLen(String& s) {
int length = 0;
int i = 0;
while (s.ch[i] != '\0') {
length++;
i++;
}
return length;
}
int GetSubstringPos(String& s1, String& s2) {
if (s2.len > s1.len) {
return 0;
}
for (int i = 0; i < s1.len-s2.len; i++) {
for (int j = 0; j < s2.len; j++) {
if (s1.ch[i + j] != s2.ch[j]) {
break;
}
if (j==s2.len-1) {
return 1;
}
}
}
return 0;
}
int CmpString(String& s1, String& s2) {
int mins = min(s1.len, s2.len);
for (int i = 0; i < mins; i++) {
if (s1.ch[i] > s2.ch[i]) {
return 1;
}
if (s1.ch[i] < s2.len) {
return -1;
}
}
if (s1.len == s2.len) {
return 0;
}
if (s1.len > s2.len) {
return 1;
}
return -1;
}
String InsertString(String& s1, String& s2, int pos) {
String S;
InitString(S);
if (pos<=0 || pos>s1.len+1) {
cout << "Conduct error" << endl;
return S;
}
int i = 0;
for (i; i < pos-1; i++) {
S.ch[i] = s1.ch[i];
}
int j = i;
int k = 0;
for (j; j < i + s2.len; j++) {
S.ch[j] = s2.ch[k++];
}
for (j; j < s1.len + s2.len; j++) {
S.ch[j] = s1.ch[i++];
}
S.len = s1.len + s2.len;
S.ch[S.len] = '\0';
return S;
}
String DeleteString(String& s, int pos,int len ) {
String S;
InitString(S);
if (pos<1 || pos>s.len||pos+len-1>s.len) {
cout << "Conduct error" << endl;
return S;
}
int index = pos - 1;
int i;
for ( i = 0; i < index; i++) {
S.ch[i] = s.ch[i];
}
int j = i;
for (i+=len;i<s.len;i++) {
S.ch[j++] = s.ch[i];
}
S.len = j;
S.ch[S.len] = '\0';
return S;
}
void PrintString(String& s) {
for (int i = 0; i < s.len; i++) {
cout << s.ch[i] ;
}
cout << endl;
}
int main() {
String s1;
InitString(s1);
CreateSting(s1);
PrintString(s1);
cout << GetLen(s1) << endl;
String s2;
CopyString(s2, s1);
PrintString(s2);
cout << CmpString(s1, s2) << endl;
String s3 = ConcatString(s1, s2);
PrintString(s3);
String s4 = InsertString(s1, s2, 2);
PrintString(s4);
String s5 = DeleteString(s1, 3, 2);
PrintString(s5);
String s6;
InitString(s6);
CreateSting(s6);
cout << GetSubstringPos(s4,s6)<<endl;
return 0;
}
运行结果如下:
下期补充kmp算法。