串的定长顺序存储结构

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
typedef int Status;
#define MAXSTRLEN 40 //在255范围内定义最大串长(255为1个字节)
typedef char SString[MAXSTRLEN + 1]; //位置0存放串的长度
/*********************************************************/
Status StrAssign(SString T, char *chars); //字符串赋值
Status StrCopy(SString T, SString S); //字符串拷贝
Status StrEmpty(SString S); //字符串判空
Status StrLength(SString S); //返回字符串长度
Status StrPrint(SString T); //打印字符串
Status ClearString(SString S); //清空字符串
Status Concat(SString T, SString S1, SString S2); //字符串联结
Status Index(SString T, SString S); //索引子串位置
Status StrInsert(SString T, SString S, int pos); //插入子串
Status StrDelete(SString S, int pos, int len); //删除某个位置长度为len的子串
/*自己写的方法,传入两个字符串进行比较,如果完全匹配则相同,不完全匹配则判断是否为子串*/
Status StrCompare(SString T, SString S); //字符串比较
Status StrSubString(SString longStr, SString shortStr); //匹配子串
/*********************************************************/
int main()
{
    SString S1, S2, S3, S4, T;
    char str[MAXSTRLEN];
    int pos, len;
    printf("Input S1:");
    gets(str); //scanf无法读取到空格
    printf("----------------------------------\n");
    StrAssign(S1, str);//将输入的str赋值给串S1
    printf("str[40]:%s\n", str);
    StrPrint(S1);
    printf("Length:%d\n", StrLength(S1));
    // printf("S1:%s\n", S1 + 1); //跳过S1[0]打印
    printf("----------------------------------\n");
    StrCopy(S2, S1);
    printf("StrCopy... OK.\n");
    printf("S2:");
    StrPrint(S2);
    printf("S2.len:%d\n", StrLength(S2));
    printf("----------------------------------\n");
    ClearString(S2);
    StrEmpty(S2);
    printf("----------------------------------\n");
    printf("Input S3:");
    gets(str);
    StrAssign(S3, str);
    printf("StrCompare... OK.\n");
    StrCompare(S3, S1);
    printf("----------------------------------\n");
    Concat(S4, S1, S3);
    printf("Concat... OK.\n");
    printf("S4:");
    StrPrint(S4);
    printf("Length:%d\n", StrLength(S4));
    printf("----------------------------------\n");
    printf("Index S4... OK.\n");
    printf("Input index str:");
    gets(str);
    StrAssign(T, str);
    Index(T, S4);
    printf("----------------------------------\n");
    printf("Input Position:");
    scanf("%d", &pos);
    printf("Insert str to S4... OK.\n");
    StrInsert(T, S4, pos);
    printf("S4:");
    StrPrint(S4);
    printf("Length:%d\n", StrLength(S4));
    printf("----------------------------------\n");
    printf("Input Position and Length:");
    scanf("%d %d", &pos, &len);
    StrDelete(S4, pos, len);
    printf("S4:");
    StrPrint(S4);
    printf("Length:%d\n", StrLength(S4));
    return 0;
}
/* 字符串赋值,当赋值字符串长度超过被赋值字符串时候截断,未超过时先将长度存入T[0],再逐位赋值 */
Status StrAssign(SString T, char *chars)
{
    int i;
    if (strlen(chars) > MAXSTRLEN)
    {
        for (i = 1; i <= MAXSTRLEN; ++i)
            T[i] = *(chars + i - 1);
        T[0] = MAXSTRLEN;
    }
    else
    {
        T[0] = strlen(chars); //p.s.此时T[0]存入的是int类型的数据,打印%s时无法显示
        for (i = 1; i <= MAXSTRLEN; ++i)
            T[i] = *(chars + i - 1);
        return OK;
    }
}
/* 字符串拷贝,逐个字符拷贝(仅拷贝长度范围内的) */
Status StrCopy(SString T, SString S)
{
    int i;
    //p.s.此处要拷贝长度+1,将S1的\0同时拷贝进去,否则T中没有\0
    for (i = 1; i <= S[0]; ++i)
        T[i] = S[i];
    T[0] = S[0];
    return OK;
}
/* 字符串判空,当S[0]==0时为空 */
Status StrEmpty(SString S)
{
    if (S[0] == 0)
    {
        printf("String is Empty\n");
        return TRUE;
    }
    else
    {
        printf("String is not Empty\n");
        return FALSE;
    }
}
/* 返回子串长度 */
Status StrLength(SString S)
{
    return S[0];
}
/* 打印字符串 */
Status StrPrint(SString T)
{
    int i;
    for (i = 1; i <= T[0]; ++i)
    {
        printf("%c", T[i]);
    }
    printf("\n");
    return OK;
}
/* 清空字符串 */
Status ClearString(SString S)
{
    S[0] = 0;
    return OK;
}
/* 字符串联接,通过T来存储结果,S2连接而成的新串,若未截断则返回TRUE,截断返回FAlSE,注意字符串数组越界问题 */
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;
    }
}
/* 索引子串 */
Status Index(SString T, SString S)
{
    int i = 1, j = 1;
    while (j <= T[0] && i <= S[0])
    {
        if (T[j] == S[i])
        {
            ++i;
            ++j;
        }
        else
        {
            i = i - j + 2;
            j = 1;
        }
    }
    if (j > T[0])
    {
        printf("Position:%d\n", i - j + 1);
        return OK;
    }
    else
    {
        printf("substring is not exist\n");
        return ERROR;
    }
}
/* 在位置pos处插入子串T */
Status StrInsert(SString T, SString S, 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 StrDelete(SString S, int pos, int len)
{
    int i;
    if (pos > S[0])
        return ERROR;
    else if (pos + len > S[0])
        len = S[0] - pos + 1;
    for (i = pos + len; i <= S[0]; ++i)
        S[i - len] = S[i];
    S[0] -= len;
}
/* 字符串比较。比较字符串是否完全相同,如果不同则判断子串所在的位置 */
Status StrCompare(SString T, SString S)
{
    int i, j;
    /* 当两个字符串长度相同时,逐个判断字符是否相同,不相同则退出,相同则继续比较 */
    if (T[0] == S[0])
    {
        for (i = 1; i <= S[0]; ++i)
        {
            if (T[i] != S[i])
            {
                printf("A.len==B.len , A!=B \n");
                return ERROR;
            }
        }
        printf("A == B\n");
        return OK;
    }
    else if (T[0] < S[0])
        StrSubString(T, S);
    else if (T[0] > S[0])
        StrSubString(S, T);
}
/* 判断A是否是B的子串。逐个遍历长字符串,当短字符串首字符与长字符串字符相同时,短字符串与长字符串逐个比较,中途有不匹配的情况则重新开始比较,长字符串继续遍历,如果短字符串比对完并且最后一个字符也相同时则是子串 */
Status StrSubString(SString shortStr, SString longStr)
{
    int i, j = 1;
    for (i = 1; i <= longStr[0]; ++i)
    {
        if (shortStr[1] == longStr[i])
        {
            for (j = 1; j <= shortStr[0]; ++j)
            {
                if (j == shortStr[0] && shortStr[j] == longStr[j + i - 1])
                {
                    printf("A is substring of B.Location is:%d\n", i);
                    return OK;
                }
                if (shortStr[j] != longStr[j + i - 1])
                    break;
            }
        }
    }
    printf("A not substring of B\n");
    return ERROR;
}#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
typedef int Status;
#define MAXSTRLEN 40 //在255范围内定义最大串长(255为1个字节)
typedef char SString[MAXSTRLEN + 1]; //位置0存放串的长度
/*********************************************************/
Status StrAssign(SString T, char *chars); //字符串赋值
Status StrCopy(SString T, SString S); //字符串拷贝
Status StrEmpty(SString S); //字符串判空
Status StrLength(SString S); //返回字符串长度
Status StrPrint(SString T); //打印字符串
Status ClearString(SString S); //清空字符串
Status Concat(SString T, SString S1, SString S2); //字符串联结
Status Index(SString T, SString S); //索引子串位置
Status StrInsert(SString T, SString S, int pos); //插入子串
Status StrDelete(SString S, int pos, int len); //删除某个位置长度为len的子串
/*自己写的方法,传入两个字符串进行比较,如果完全匹配则相同,不完全匹配则判断是否为子串*/
Status StrCompare(SString T, SString S); //字符串比较
Status StrSubString(SString longStr, SString shortStr); //匹配子串
/*********************************************************/
int main()
{
    SString S1, S2, S3, S4, T;
    char str[MAXSTRLEN];
    int pos, len;
    printf("Input S1:");
    gets(str); //scanf无法读取到空格
    printf("----------------------------------\n");
    StrAssign(S1, str);//将输入的str赋值给串S1
    printf("str[40]:%s\n", str);
    StrPrint(S1);
    printf("Length:%d\n", StrLength(S1));
    // printf("S1:%s\n", S1 + 1); //跳过S1[0]打印
    printf("----------------------------------\n");
    StrCopy(S2, S1);
    printf("StrCopy... OK.\n");
    printf("S2:");
    StrPrint(S2);
    printf("S2.len:%d\n", StrLength(S2));
    printf("----------------------------------\n");
    ClearString(S2);
    StrEmpty(S2);
    printf("----------------------------------\n");
    printf("Input S3:");
    gets(str);
    StrAssign(S3, str);
    printf("StrCompare... OK.\n");
    StrCompare(S3, S1);
    printf("----------------------------------\n");
    Concat(S4, S1, S3);
    printf("Concat... OK.\n");
    printf("S4:");
    StrPrint(S4);
    printf("Length:%d\n", StrLength(S4));
    printf("----------------------------------\n");
    printf("Index S4... OK.\n");
    printf("Input index str:");
    gets(str);
    StrAssign(T, str);
    Index(T, S4);
    printf("----------------------------------\n");
    printf("Input Position:");
    scanf("%d", &pos);
    printf("Insert str to S4... OK.\n");
    StrInsert(T, S4, pos);
    printf("S4:");
    StrPrint(S4);
    printf("Length:%d\n", StrLength(S4));
    printf("----------------------------------\n");
    printf("Input Position and Length:");
    scanf("%d %d", &pos, &len);
    StrDelete(S4, pos, len);
    printf("S4:");
    StrPrint(S4);
    printf("Length:%d\n", StrLength(S4));
    return 0;
}
/* 字符串赋值,当赋值字符串长度超过被赋值字符串时候截断,未超过时先将长度存入T[0],再逐位赋值 */
Status StrAssign(SString T, char *chars)
{
    int i;
    if (strlen(chars) > MAXSTRLEN)
    {
        for (i = 1; i <= MAXSTRLEN; ++i)
            T[i] = *(chars + i - 1);
        T[0] = MAXSTRLEN;
    }
    else
    {
        T[0] = strlen(chars); //p.s.此时T[0]存入的是int类型的数据,打印%s时无法显示
        for (i = 1; i <= MAXSTRLEN; ++i)
            T[i] = *(chars + i - 1);
        return OK;
    }
}
/* 字符串拷贝,逐个字符拷贝(仅拷贝长度范围内的) */
Status StrCopy(SString T, SString S)
{
    int i;
    //p.s.此处要拷贝长度+1,将S1的\0同时拷贝进去,否则T中没有\0
    for (i = 1; i <= S[0]; ++i)
        T[i] = S[i];
    T[0] = S[0];
    return OK;
}
/* 字符串判空,当S[0]==0时为空 */
Status StrEmpty(SString S)
{
    if (S[0] == 0)
    {
        printf("String is Empty\n");
        return TRUE;
    }
    else
    {
        printf("String is not Empty\n");
        return FALSE;
    }
}
/* 返回子串长度 */
Status StrLength(SString S)
{
    return S[0];
}
/* 打印字符串 */
Status StrPrint(SString T)
{
    int i;
    for (i = 1; i <= T[0]; ++i)
    {
        printf("%c", T[i]);
    }
    printf("\n");
    return OK;
}
/* 清空字符串 */
Status ClearString(SString S)
{
    S[0] = 0;
    return OK;
}
/* 字符串联接,通过T来存储结果,S2连接而成的新串,若未截断则返回TRUE,截断返回FAlSE,注意字符串数组越界问题 */
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;
    }
}
/* 索引子串 */
Status Index(SString T, SString S)
{
    int i = 1, j = 1;
    while (j <= T[0] && i <= S[0])
    {
        if (T[j] == S[i])
        {
            ++i;
            ++j;
        }
        else
        {
            i = i - j + 2;
            j = 1;
        }
    }
    if (j > T[0])
    {
        printf("Position:%d\n", i - j + 1);
        return OK;
    }
    else
    {
        printf("substring is not exist\n");
        return ERROR;
    }
}
/* 在位置pos处插入子串T */
Status StrInsert(SString T, SString S, 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 StrDelete(SString S, int pos, int len)
{
    int i;
    if (pos > S[0])
        return ERROR;
    else if (pos + len > S[0])
        len = S[0] - pos + 1;
    for (i = pos + len; i <= S[0]; ++i)
        S[i - len] = S[i];
    S[0] -= len;
}
/* 字符串比较。比较字符串是否完全相同,如果不同则判断子串所在的位置 */
Status StrCompare(SString T, SString S)
{
    int i, j;
    /* 当两个字符串长度相同时,逐个判断字符是否相同,不相同则退出,相同则继续比较 */
    if (T[0] == S[0])
    {
        for (i = 1; i <= S[0]; ++i)
        {
            if (T[i] != S[i])
            {
                printf("A.len==B.len , A!=B \n");
                return ERROR;
            }
        }
        printf("A == B\n");
        return OK;
    }
    else if (T[0] < S[0])
        StrSubString(T, S);
    else if (T[0] > S[0])
        StrSubString(S, T);
}
/* 判断A是否是B的子串。逐个遍历长字符串,当短字符串首字符与长字符串字符相同时,短字符串与长字符串逐个比较,中途有不匹配的情况则重新开始比较,长字符串继续遍历,如果短字符串比对完并且最后一个字符也相同时则是子串 */
Status StrSubString(SString shortStr, SString longStr)
{
    int i, j = 1;
    for (i = 1; i <= longStr[0]; ++i)
    {
        if (shortStr[1] == longStr[i])
        {
            for (j = 1; j <= shortStr[0]; ++j)
            {
                if (j == shortStr[0] && shortStr[j] == longStr[j + i - 1])
                {
                    printf("A is substring of B.Location is:%d\n", i);
                    return OK;
                }
                if (shortStr[j] != longStr[j + i - 1])
                    break;
            }
        }
    }
    printf("A not substring of B\n");
    return ERROR;
}

猜你喜欢

转载自blog.csdn.net/qq_40729286/article/details/82789302