c语言串--顺序存储

3.1 串--顺序存储

  1. main.c
//
//  main.c
//  11_StackString
//
//  Created by ls on 2022/5/24.
//  Copyright © 2022 LSC001. All rights reserved.
//

#include "SString.h"

int main() {
    SString S;
    InitString(S);
    char *str = "ABC";
    StrAssign(S,str);
    
    SString T;
    InitString(T);
    StrAssign(T,"12");
    StrInsert(S,4,T);
    PrintString(S);
//
//    SString V;
//    InitString(V);
//    StrAssign(V,"++");
//
//    PrintString(S);
//    PrintString(T);
//    PrintString(V);

//    StrReplace(S,T,V);
    
//    PrintString(S);
    
//    printf("%d\n",StrIndex(S,T,3));
//    PrintString(S);
//    StrDelete(S,4,3);
//    PrintString(S);
    
    
//    printf("%d\n",StrCompare(S,T));
//    SString T;
//    StrCopy(T,S);
//    PrintString(S);
//    PrintString(T);
//    printf("%d\n",StrEmpty(S));
//    printf("%d\n",StrLength(S));
//    StrClear(S);
//    PrintString(S);
//    SString A;
//    StrConcat(A,S,T);
//    PrintString(A);
//    PrintString(T);
//    PrintString(S);
//    StrClear(S);
//    PrintString(S);
//    PrintString(S);
//    SString T = "12";
    
    
    
    

    //int select=1;
    
//    while(select)
//    {
//        printf("***********************************************\n");
//        printf("* [1]  StrAssign            [2]  StrCopy      *\n");
//        printf("* [3]  StrEmpty             [4]  StrCompare   *\n");
//        printf("* [5]  StrLength            [6]  StrConcat    *\n");
//        printf("* [7]  SubString            [8]  StrIndex     *\n");
//        printf("* [9]  StrReplace           [10] StrInsert    *\n");
//        printf("* [11] StrDelete            [11] StrClear     *\n");
//        printf("* [11] PrintString                            *\n");
//        printf("***********************************************\n");
//        printf("请选择:> ");
//        scanf("%d",&select);
//        if(0 == select)
//            break;
    


    //void StrDelete(SString S,int pos,int len);             // 11 从pos删除len的字符。
    //void StrClear(SString S);                              // 12
    //void PrintString(SString S);                           // 13
    
    
    
//
//        switch (select)
//        {
//            case 1:
//
//                break;
//            case 2:
//                pop_back(&mystack,&value);
//                show_Stack(&mystack);
//                break;
//            case 3:
//                show_Stack(&mystack);
//                break;
//            case 4:
//                printf("Empty: %ld\n",isEmpty(mystack));
//                break;
//            case 5:
//                get_top(mystack);
//                break;
//            case 6:
//                printf("length: %ld\n",length(mystack));
//                break;
//            case 7:
//                clear0(&mystack);
//                break;
//            case 8:
//                destroy(&mystack);
//                break;
//            default:
//                printf("输入错误!");
//                break;
//        }
//    }
    //destroy(&mystack);
    printf("Hello, World!\n");

    return 0;
}

  1. SString.h

//
//  SString.h
//  11_StackString
//
//  Created by ls on 2022/5/24.
//  Copyright © 2022 LSC001. All rights reserved.
//

#ifndef SString_h
#define SString_h

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

// 1
#define MAXSTRLEN 30
#define u_char unsigned char

typedef u_char SString[MAXSTRLEN+1];

// 2
void InitString(SString S);
void StrAssign(SString S,char *str);                   // 1  赋值,
void StrCopy(SString S,SString T);                     // 2  复制
bool StrEmpty(SString S);                              // 3  判断字符串是否为空
int  StrCompare(SString S,SString T);                  // 4  比较两个字符串的大小
int  StrLength(SString S);                             // 5  字符串长度
void StrConcat(SString T,SString s1,SString s2);       // 6  T=s1+s2
void SubString(SString S,SString sub,int pos,int len); // 7  求子串,在指定位置pos上,截取了len,赋值给sub。
int  StrIndex(SString S,SString T,int pos);            // 8  从S的pos匹配T,找出T首次出现的位置。返回相应下标或-1.
void StrReplace(SString S,SString T,SString V);        // 9  替换。用V替换S中所有与T相等不重叠的
void StrInsert(SString S,int pos,SString T);           // 10 在S的pos前插入T。
void StrDelete(SString S,int pos,int len);             // 11 从pos删除len的字符。
void StrClear(SString S);                              // 12 清除
void PrintString(SString S);                           // 13 打印

#endif /* SString_h */
  1. SString.c

//
//  SString.c
//  11_StackString
//
//  Created by ls on 2022/5/24.
//  Copyright © 2022 LSC001. All rights reserved.
//

#include "SString.h"

void InitString(SString S)
{
    S[0]='\0';
}
void StrAssign(SString S,char *str)                   // 1 把str放在T中。
{
    int i = 0;
    while(str[i] != '\0')
    {
        S[i] = str[i];
        i++;
    }
    S[i] = '\0';
}
void StrCopy(SString S,SString T)                     // 2
{
    int i = 0;
    while(T[i] != '\0')
    {
        S[i] = T[i];
        i++;
    }
    S[i] = '\0';
}
bool StrEmpty(SString S)                              // 3
{
    return S[0]=='\0';
}
int  StrCompare(SString S,SString T)                  // 4
{
    int tmp = 0;
    while(*S != '\0' || *T != '\0' )
    {
        tmp = *S - *T;
        if(tmp != 0) break;
        ++S;
        ++T;
    }
    if(tmp>0)tmp = 1;
    else if(tmp<0)tmp = -1;
    return tmp;
}

int  StrLength(SString S)                             // 5
{
    int i = 0;
    while (*S!='\0') {
        ++S;
        ++i;
    }
    return i;
}
void StrConcat(SString T,SString s1,SString s2)       // 6     T=s1+s2
{
    int len_s1 = StrLength(s1);
    int len_s2 = StrLength(s2);
    if(len_s1 + len_s2 <= MAXSTRLEN)
    {
        int i=0,j = 0 ;
        while (s1[i] !='\0') {
            T[i] = s1[i];
            ++i;
        }
        while (s2[j] !='\0') {
            T[i+j] = s2[j];
            ++j;
        }
        T[j+i] = '\0';
    }
    else if(len_s1 <= MAXSTRLEN)
    {
        int i=0,j = 0 ;
        while (s1[i] !='\0') {
            T[i] = s1[i];
            ++i;
        }
        while (j<MAXSTRLEN-i) {
            T[i+j] = s2[j];
            ++j;
        }
        T[MAXSTRLEN] = '\0';
    }
    else
    {
        int i=0 ;
        while (s1[i] !='\0') {
            T[i] = s1[i];
            ++i;
        }
        T[MAXSTRLEN] = '\0';
    }
    
}
void SubString(SString S,SString sub,int pos,int len) // 7
{
    if(pos<0 || pos>StrLength(S) || len<0 || len> StrLength(S)) return;
    int i = 0;
    while (len>0) {
        sub[i]=S[pos+i-1];
        ++i;
        --len;
    }
    sub[i]='\0';
}
int StrIndex(SString S,SString T,int pos)            // 8
{
    int len_s = StrLength(S);
    int len_t = StrLength(T);
    if(pos<0 || pos>len_s)return -10000;
    int i = pos-1,j = 0;
    while (i < len_s && j < len_t) {
        if(S[i] == T[j]){++i; ++j;}
        else{i=i-j+1;j=0;}
    }
    if(j>=len_t)return i-len_t;
    else return 0;
}
void StrReplace(SString S,SString T,SString V)        // 9
{
    int len_s = StrLength(S);
    int len_t = StrLength(T);
    int len_v = StrLength(V);
    int pos=1;
    while (pos-1<len_s) {
        int p_ = StrIndex(S,T,pos);
        if(p_ == 0)break;
        StrDelete(S,p_+1,len_t);
        StrInsert(S,p_+1,V);
        pos = p_+ len_v+1;
        //i = pos-1;
    }
    printf("LSLSLS!\n");
}
void StrInsert(SString S,int pos,SString T)           // 10
{
    int len_s=StrLength(S);
    int len_t=StrLength(T);
    if(len_s + len_t > MAXSTRLEN || pos<0) return;
    int i=len_s-1;
    while (i>=pos-1) {
        S[i+len_t]=S[i];
        i--;
    }
    int j=0;
    while (T[j] != 0) {
        S[pos-1+j] = T[j];
        ++j;
        S[len_s + len_t ]='\0';
    }
}
void StrDelete(SString S,int pos,int len)             // 11
{
    if(pos+len>StrLength(S)) return;
    int i = pos+len-1;
    while (S[i]!= '\0') {
        S[i-len]=S[i];
        ++i;
    }
    S[i-len]='\0';
}
void StrClear(SString S)                              // 12
{
    S[0]='\0';
}
void PrintString(SString S)                              // 13
{
    int i=0;
    while (S[i]!='\0') {
        printf("%c ",S[i]);
        i++;
    }
    printf("\n");
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值