字符数组_串的实现

// 在这里预先定义,'/0'作为串结束的标志
#include<iostream>
#include<stdio.h>
#include<string.h>
char* str = new char[100];


// 线性表传入参数需要引用,线性表指针被包装,所以修改值需要引用
// 字符串操作可以直接传指针
void StrAssign(char* S,char* T)
{
    // strlen()位于<string.h>里,用于char*字符数组求长度;
    // str.length()位于<string>里,用于string字符串求长度;
    // 两个函数无法交叉使用
        int length = strlen(T);
        int cnt=0;
        while(cnt < length)
        {
             S[cnt] = T[cnt];
             ++cnt;
        }
        //对于普通串最好进行操作以后在串尾加'\0',这样保证后面操作程序运行的正确
        S[cnt] = '\0';
        return;
}


void StrCopy(char* T,char* S)
{
        int cnt = 0;
        while(cnt < strlen(S))
        {
           T[cnt] = S[cnt];
           ++cnt;
        }
        T[cnt] = '\0';
        return ;
}
// 返回字符串长度
int StrLength(char *S)
{
        return strlen(S);
}


// 是否为空串
bool StrEmpty(char* S)
{
        if(strlen(S) != 0)
            return false;
        return true;
}


// 返回字符串长度,c++自带求字符数组长度的函数
//int StrLength(char *S){}


// 连接两个字符串,并且不改变这两个串的值
char* Concat(char* S1,char* S2)
{


        char* s = new char[strlen(S1)+strlen(S2)+1];
        int cnt = 0,cas=0;
        while(S1[cnt])
        {
            s[cas++] = S1[cnt++];
        }
        cnt = 0;
        while(S2[cnt])
        {
            s[cas++] = S2[cnt++];
        }
        s[cas] = '\0';
        return s;
}


// 将串清空
void ClearStr(char* S)
{
    // 调用字符串求长度函数时'\0'也是作为串结束的标志
    // 后面的操作可以对串进行覆盖
      S[0] = '\0';
      return ;
}


// 比较两个串的大小
int Compare(char* S1,char* S2)
{
      int cnt = 0;
      while(S1[cnt]&&S2[cnt])
      {
          // 使用if-else-if减少判断次数
          if(S1[cnt] > S2[cnt])
            return 1;
          else if(S1[cnt] < S2[cnt])
            return -1;
          ++cnt;
      }
      if(S1[cnt])return 1;
      else if(S2[cnt])return -1;
      return 0;
}


// 截取定位的子串
char* SubString(char* S,int pos,int len)
{
      char* sub = new char[len+1];
      int length = strlen(S);
      if(pos > length)
      {
          // 直接return '\0'在程序外操作发生错误
          // !先赋值在返回
            sub[0] = '\0';
      }
      else
      {
          int cnt = 0,cas = pos;
          // 设定从pos截取len超过串长度,将前面有效部分截取
          while((cas < (pos+len)) && S[pos])
          {
              sub[cnt++] = S[cas++];
          }
          sub[cnt] = '\0';
      }
      return sub;
}


// 返回第一次出现相同子串的定位pos值
int Index(char* S1,char* S2,int pos)
{
    // cas定位S2串中坐标,len表示配对的子串长度
      int  cas = 0,len = 0;
      int  len1=strlen(S1),len2=strlen(S2);
      while(pos < len1)
      {
          while(cas < len2)
          {
              // 当存在相同字符进入循环,长度在循环中增加
                while(S1[pos+len] == S2[cas+len])
                {
                    ++len;
                }
                // 长度不为0跳出循环
                if(len != 0)   break;
                // 未进入循环,S2坐标右移
                ++cas;
          }
          if(len !=0)   break;
          // 当前pos下标未找到适配字符,S1右移;
          // cas置零
          ++pos,cas=0;
      }
      if(len == 0)return 0;
      else return pos;
}


// 从定位pos起插入字符串
// 注意后尾长度出现覆盖问题,pos后移会产生覆盖问题
char* StrInsert(char* S,char *T,int pos)
{
       int len_t = strlen(T);
       int len_s = strlen(S);
       char* str_s_t =new char[len_t+len_s+10];
       int cnt = 0,cas = 0;
       while(cnt < pos )
       {
        str_s_t[cas++] = S[cnt++];
       }
        cnt = 0;
       while(cnt < len_t)
       {
            str_s_t[cas++] = T[cnt++];
       }
       while(S[pos])
       {
            str_s_t[cas++] = S[pos++];
       }
        str_s_t[cas] = '\0';
        return str_s_t;
}


// 从定位pos开始删除子串
void StrDelete(char* S,int pos,int len)
{
    int len_s = strlen(S);
    if((pos+len) > len_s)
    {
         S[pos]= '\0';
    }
    else
    {
        int cnt = pos,cas = pos + len;
        while(S[cas])
        {
            S[pos++] = S[cas++];
        }
        S[pos] = '\0';
    }
}


// 销毁串,自带函数不需要定义
void DestroyString(char* S){ delete[] S; }// new和delete作为关键字不是函数不需要加()


int main()
{
        char* t = new char[100];// 长度在使用过程中可以变换,初值可以随意设置;
        StrAssign(str,"abcdefg");
        int i=0;printf("      ");while(str[i])printf("%c",str[i++]);printf("\n");
        StrCopy(t,str);
        i = 0;printf("      ");while(t[i]){printf("%c",t[i++]);}printf("\n");
        char* str_t = Concat(str,"dcba");
        i = 0;printf("      ");while(str_t[i]){printf("%c",str_t[i++]);}printf("\n");
        if(Compare(str,t) == 0)
        {
            printf("      ");
            printf("输入两个字符串相等!\n");
        }
        char* subStr = SubString(str,100,3);
        char* subStr1 = SubString(str,2,3);
        char* subStr2 = SubString(str,2,100);
        i=0;printf("      ");while(subStr[i]){printf("%c",subStr[i++]);}printf("\n");
        i=0;printf("      ");while(subStr1[i]){printf("%c",subStr1[i++]);}printf("\n");
        i=0;printf("      ");while(subStr2[i]){printf("%c",subStr2[i++]);}printf("\n");
        printf("      ");printf("%d\n",Index("abcde","fghij",3));
        printf("      ");printf("%d\n",Index("abcde","fgcdehij",0));
        printf("      ");printf("%d\n",Index("abcde","fgcdehij",3));
        char* str1 = new char[100];
        StrAssign(str1,"abcglmnabcdefghijklmn");
        char* str2 = new char[100];
        StrAssign(str2,"def");
        char* str3=StrInsert(str1,str2,3);
        i=0;printf("      ");while(str3[i]){printf("%c",str3[i++]);}printf("\n");
        StrDelete(str3,5,20);
        i=0;printf("      ");while(str3[i]){printf("%c",str3[i++]);}printf("\n");
        StrDelete(str3,1,1);
        i=0;printf("      ");while(str3[i]){printf("%c",str3[i++]);}printf("\n");
        ClearStr(str_t);
        if(StrEmpty(str_t))
        {
            printf("      ");
            printf("输入为空串!\n");
        }
        delete[] str;
        delete[] str1;
        delete[] str2;
        delete[] str3;
        delete[] subStr;
        delete[] subStr1;
        delete[] subStr2;
        delete[] t;
        delete[] str_t;
        return 0;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值