1. 程式人生 > >資料結構中對字串的操作

資料結構中對字串的操作

不說廢話直接上原始碼
C語言實現

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define MAXSTRLEN 255
#define OK 1
#define ERROR -1
typedef  int Status;
typedef struct{
    char str[MAXSTRLEN];
    int length;
}StringType;
Status StrConcat(StringType *s, StringType *t);
Status subString(StringType s, int pos, int len);
void MyPuts(StringType s);
int StrCompare(StringType s, StringType t);
void StrLength(StringType s);
void ClearStr(StringType *s);
int Index(StringType s, StringType t, int pos);
int main()
{
    printf("--------選單---------\n");
    printf("1,字串長度\n");
    printf("2,清空字串\n");
    printf("3,兩個字串連線\n");
    printf("4,兩個字串比較大小\n");
    printf("5,求子串\n");
    printf("6,求子串在主串中的位置\n");
    StringType s;
    printf("請輸入字串:");
    while(1)
    {
        int key;
        int pos,len;

        StringType p, q;
        StringType m, n;
        StringType a;
        StringType x, y;
        int pos1;

        gets(s.str);
        s.length = strlen(s.str);
        printf("請輸入要執行的操作:");
        scanf("%d", &key);
        switch(key)
        {
        case 1:
            StrLength(s);
            break;
        case 2:
            ClearStr(&s);
            break;
        case 3:
                getchar();
                printf("請輸入字串:");
                gets(p.str);
                /*字串的長度要存到資料結構中的length中*/
                p.length = strlen(p.str);
                printf("請輸入字串:");
                gets(q.str);
                q.length = strlen(q.str);
                StrConcat(&p, &q);
                MyPuts(p);
                break;
        case 4:
                getchar();
                printf("請輸入字串:");
                gets(m.str);
                /*字串的長度要存到資料結構中的length中*/
                m.length = strlen(m.str);
                printf("請輸入字串:");
                gets(n.str);
                n.length = strlen(n.str);
                StrCompare(m,n);
                break;
        case 5:

                getchar();
                printf("請輸入字串:");
                gets(a.str);
                /*字串的長度要存到資料結構中的length中*/
                a.length = strlen(a.str);
                printf("請輸入子串開始的位置:");
                scanf("%d", &pos);
                printf("請輸入子串長度:");
                scanf("%d", &len);
                subString(a, pos, len);
                break;
        case 6:
                getchar();
                printf("請輸入字串:");
                gets(x.str);
                /*字串的長度要存到資料結構中的length中*/
                x.length = strlen(x.str);
                printf("請輸子串:");
                gets(y.str);
                y.length = strlen(y.str);
                printf("你想從第幾個位置開始查詢:");
                scanf("%d", &pos1);
                Index(x,y,pos1);
                break;
        default:
            printf("defaul\n");
            break;
        }
    }
    return 0;
}

Status StrConcat(StringType *s, StringType *t)
{
    int i;
    if((s->length + t->length)>MAXSTRLEN)
    {
        printf("連線後長度超出範圍\n");
        return ERROR;
    }
    for(i=0; i < t->length; i++)
    {
        s->str[s->length+i] = t->str[i];
    }
    s->length = s->length + t->length;
    return OK;
}

Status subString(StringType s, int pos, int len)
{
    StringType sub;
    int k, j;
    if(pos<1||pos>s.length||len<0||len>(s.length-pos+1))
        return ERROR;
    sub.length = len;
    for(j=0, k=pos-1;k<pos+len-1;k++,j++)
        sub.str[j] = s.str[k];
        printf("子串為:");
    for(k = 0; k<sub.length; k++)
    {
        printf("%c", sub.str[k]);
    }
    printf("\n");
    return OK;
}
void MyPuts(StringType s)
{
    int i;
    for(i = 0; i < s.length; i++)
    {
        putchar(s.str[i]);
    }
}

int StrCompare(StringType s, StringType t)
{
    int i;
    for(i = 0; i<s.length&&i<t.length; i++)
    {
        if(s.str[i] != t.str[i])
        {
            printf("兩個字串不相等,Ascll碼值相差:%d\n",s.str[i] - t.str[i] );
            return s.str[i] - t.str[i];
        }
    }
    if(s.length - t.length == 0)
    {
        printf("兩個字串相等\n");
        return s.length - t.length;
    }
    if(s.length - t.length > 0)
    {
        printf("兩個字串不相等\n");
        return s.length - t.length;
    }

}

void StrLength(StringType s)
{
    if(s.length == 0)
        printf("字串為空\n");
    else
        printf("字串長度為%d\n", s.length);
}

void ClearStr(StringType *s)
{
    if(s->str)
    {
        free(s->str);
    }
    s->length = 0;
    printf("字串以清空\n");
}

int Index(StringType s, StringType t, int pos)
{
    int i = pos-1,j=0;
    while(i <= s.length -1 && j<= t.length -1)
    {
        if(s.str[i] == t.str[j])
        {
            i++;
            j++;
        }
        else
        {
            i = i-j+1;
            j=0;
        }
    }
    if(j>=t.length)
    {
        printf("匹配成功,子串在主串第 %d 個字元後的位置\n",i-t.length);
        return i-t.length-1;
    }
    else
    {
        printf("匹配失敗\n");
        return 0;
    }
}