借鉴了一下博客园的一篇文章,然后自己想放在自己的blog中
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define OVERFLOW -2
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define INFEASIBLE -1
#define MAXSTRLEN 255
typedef int Status;
typedef char SString[MAXSTRLEN + 1]; //加一是为了使0号位存放串的长度
typedef struct {
char ch[MAXSTRLEN];
int len;
}SString1;
Status StrAssign(SString& T, const char* chars);
Status StrContact(SString& T, SString S1, SString S2);
Status Index(SString T, SString S);
Status Concat(SString T, SString S1, SString S2);
Status Insert(SString T, SString S, int pos);
Status StrPrint(SString T);
int main() {
SString P1, P2, S1, S2, T;
int pos = 3;
char str[MAXSTRLEN];
printf("Please enter P1\n");
gets_s(str);
StrAssign(P1, str);
//printf("%s", str); //使用printf或puts打印P1总会打印出些莫名其妙的东西,但打印str就很正常
//puts(P1);
printf("Please enter P2\n");
gets_s(str);
StrAssign(P2, str);
//StrContact(T, P1, P2);
//StrPrint(T);
//Insert(P1, P2, pos);
//StrPrint(P1);
Index(P1, P2);
}
//给新字符串赋值,生成一个值等于chars的串T
Status StrAssign(SString& T, const char* chars) {
if (strlen(chars) > MAXSTRLEN) { //当chars的长度大于最大值时便再最大值处截断
for (int i = 1; i <= MAXSTRLEN; i++)
T[i] = *(chars + i - 1);
T[0] = MAXSTRLEN;
}
else {
T[0] = strlen(chars); //此时chars长度小于max,则在T[0]存入chars的长度值
for (int j = 1; j <= MAXSTRLEN; j++)
T[j] = *(chars + j - 1);
return OK;
}
}
//字符串复制
Status Strcopy(SString & T, SString S) { //假设S已经存在
for (int i = 1; i <= S[0]; i++)
T[i] = S[i];
T[0] = S[0];
return OK;
}
//返回子串长度
Status Strlenth(SString S) {
return S[0];
}
//串连结函数
Status StrContact(SString & T, SString S1, SString S2) {
int i;
if (S1[0] + S2[0] <= MAXSTRLEN) {
for (i = 1; i <= S1[0]; i++) {
T[i] = S1[i];
}
for (i = 1; i <= S2[0]; i++) {
T[i + S1[0]] = S2[i];
}
T[0] = S1[0] + S2[0];
return TRUE;
}
else if (S1[0] < MAXSTRLEN) {
for (i = 1; i <= S1[0]; i++) {
T[i] = S1[i];
}
for (i = 1; i <= MAXSTRLEN - S1[0]; i++) {
T[i + S1[0]] = S2[i];
}
T[0] = MAXSTRLEN;
return TRUE;
}
else {
for (i = 1; i <= MAXSTRLEN; i++)
T[i] = S1[i];
T[0] = MAXSTRLEN;
return TRUE;
}
}
//索引子串 在主串T中找到子串S的位置
Status Index(SString T, SString S) {
int i = 1, j = 1;
while (i <= T[0] && j <= S[0]) { //即用最基础的模式匹配寻找相符的子串
if (T[i] == S[j]) {
i++;
j++;
}
else {
i = i - j + 2;
j = 1;
}
}
if (j > S[0]) { //即不满足j<=S[0]
printf("Postion:%d \n", i - j + 1);
return OK;
}
else { //即不满足i<=T[0]
printf("Substring does not exist");
return ERROR;
}
}
Status Concat(SString T, SString S1, SString S2) {
int i;
if (S1[0] + S2[0] <= MAXSTRLEN)
{
for (i = 1; i <= S1[0]; ++i)
T[i] = S1[i];
for (i = 1; i <= S2[0]; ++i)
T[i + S1[0]] = S2[i];
T[0] = S1[0] + S2[0];
return TRUE;
}
else //先存完S1中的,再存S2中的内容,条件是不能越界
{
for (i = 1; i <= S1[0] && i <= MAXSTRLEN - 1; ++i)
T[i] = S1[i];
for (i = 1; i <= MAXSTRLEN - S1[0]; ++i)
T[i + S1[0]] = S2[i];
T[0] = MAXSTRLEN;
return FALSE;
}
}
//在位置pos处插入子串T
Status Insert(SString S, SString T, int pos) {
int i;
if (pos > S[0])
pos = S[0] + 1;
if (S[0] + T[0] <= MAXSTRLEN) {
for (i = S[0] + T[0]; i >= pos + T[0]; --i) {
S[i] = S[i - T[0]]; //先把要插入的位置给空出来
}
for (i = 1; i <= T[0]; ++i) {
S[pos + i - 1] = T[i];
}
S[0] = S[0] + T[0];
return OK;
}
else {
for (i = MAXSTRLEN; i >= pos + T[0]; i--) {
S[i] = S[i - T[0]]; //先把要插入的位置给空出来
}
for (i = 1; i <= T[0]; ++i) {
S[pos + i - 1] = T[i];
}
S[0] = MAXSTRLEN;
return ERROR;
}
}
//打印字符串
Status StrPrint(SString T) {
int i;
for (i = 1; i <= T[0]; ++i) {
printf("%c", T[i]);
}
return OK;
}