字符数组_串的实现

来源:互联网 发布:伪娘丁丁套淘宝 编辑:程序博客网 时间:2024/05/14 11:03
// 在这里预先定义,'/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 0
原创粉丝点击