字符串的基本操作

字符串(简称串),可以将其看作是种特殊的线性表,其特殊性在于线性表的数据元素的类型总是字符性,字符串的数据对象约束为字符集。

串是由0个或多个字符组成的有限序列。一般记作:s = “s1 s2 s3 …. sn”,,其中,s是串名,用双引号括起来的字符序列称为串的值,si(1<=i <= n)称为串的元素,可以是字母,数字或其他字符,是构成串的基本单位,字符的个数n称为串的长度.

1.串的定义:串是由零个或多个组成的有序队列。 
2.串的长度:串中字符的数目称为串的长度。 
3.空串:由零个字符组成的串叫做空串,空串不包括任何字符,其长度为零。 
4.子串:串中任意个连续的字符组成的子序列称为该串的子串,空串是任何串的子串。 
5.主串:包含子串的串相应的称为主串。 
串的表示: 
串有两种表示形式:顺序存储表示和链式存储表示。 
顺序存储表示:串的顺序存储结构简称为顺序串,顺序串中的字符序列被顺序地存放在一组连续的存储单元中,主要有三种实现顺序串的方式。 
接下来实现的代码是顺序存储,带串长的实现: 
str.h

#pragma once
#define SIZE 20
typedef struct Str
{
    char elem[SIZE];//elem数组用来存放串的元素
    int length;//定义一个串长度
}Str;

void StrAssign(Str *s, const char *chars);//初始化串
void StrCpy(Str*s, Str*t);//拷贝串
int Getlength(Str *s);//获取串的长度
void Clear(Str *s);//清空串s
bool Inset(Str *s,int pos,Str *t);//在串s的pos位置插入串t
void Show(Str *s) ;//打印串
int BF(Str *s,Str *sub,int pos);//在串s里找第一个串sub,并返回串sub的第一个元素的下标
bool DeletePos(Str* s,int pos,int len);//在串中的pos位置开始删除len长度个元素
bool Delete(Str *s,int pos,Str *t);//在串中的pos位置开始删除串t
bool Replace(Str *s,Str *t,Str *v,int pos);//用v替换从pos位置开始的第一个t
bool RepIaceAll(Str *s,Str *t,Str *v);//在串s中查找到串t并用串v替换12345678910111213141516171819

这里的串和字符串的区别就是字符串会以“\n”终止符来判定字符串的长度,串中我们给length值就用来直接记录串的长度。

str.c



#include"str.h"
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>

void StrAssign(Str *s, const char *chars)//初始化串
{
    assert(s != NULL);
    int len = strlen(chars);

    /*if(s->length<len)
    {
        return;
    }*/
    s->length = len;
    for(int i = 0;i<len;i++)
    {
        s->elem[i] = chars[i];
    }
}

void StrCpy(Str*s, Str*t)//拷贝串
{
    for(int i = 0;i<t->length;i++)
    {
        s->elem[i] = t->elem[i];
    }
    s->length = t->length;
}

int Getlength(Str *s)//获取串的长度
{
    return s->length ;
}

void Clear(Str *s)//清空串s
{
    s->length = 0;
}

bool SubStr(Str *sub,Str *s,int pos,int len)//空白字符不拷贝
{
    if(pos < 0 || len < 1||pos >=s->length||pos+len>s->length-1)
    {
        return false;
    }
    for(int i = pos;i<pos+len;i++)
    {
        sub->elem[i-pos] = s->elem[i];
    }
    sub->length = len;
    return true;
}

bool Inset(Str *s,int pos,Str *t)//在串s的pos位置插入串t
{
    assert(s!=NULL);
    assert(t!=NULL);
    if(pos<0||pos>s->length||pos+t->length>SIZE)
    {
        return false;
    }
    for(int i = s->length-1;i>=pos;i--)
    {
        s->elem[i+t->length] = s->elem[i];  
    }
    for(int j = 0;j<t->length;j++)
        {
            s->elem[j+pos] = t->elem[j];
        }
    s->length +=t->length;
    return true;
}
int BF(Str *s,Str *sub,int pos)//在串s里找第一个串sub,并返回串sub的第一个元素的下标
{
    if(pos<0||pos>s->length)
    {
        return -1;
    }

    int i = pos;
    int j = 0;

    int lens = s->length;
    int lensub = sub->length;

    while (i < lens && j < lensub)
    {
        if (s->elem[i] == sub->elem[j])
        {
            i++;
            j++;
        }
        else
        {
            i = i - j + 1;
            j = 0;
        }
    }
    if (j >= lensub)
        {
            return i - j;
        }
        else 
            return -1;
}

bool DeletePos(Str* s,int pos,int len)//从pos位置开始删除len个长度
{
    assert(s!=NULL);
    if(pos<0||pos+len>s->length||len<0)
    {
        return false;
    }
    //for(int i = pos;i<len+pos;i++)
    for(int i = pos;i<s->length-len;i++)
    {
        s->elem[i] = s->elem[i+len];
    }
    s->length -= len;
    return true;
}

bool Delete(Str *s,int pos,Str *t)//在串中的pos位置开始删除串t
{
    assert(s!=NULL);
    assert(t!=NULL);
    if(pos<0||pos>s->length||t->length>s->length)
    {
        return false;
    }
    int index = BF(s,t,pos);
    if(index < 0)
    {
        return false;
    }
    return DeletePos(s,index,t->length);
}
bool Replace(Str *s,Str *t,Str *v,int pos)//用v替换从pos位置开始的第一个t
{
    assert(s!=NULL);
    assert(t!=NULL);
    assert(v!=NULL);

    int index = BF(s,t,pos);
    if(index < 0)
    {
        return false;
    }
    DeletePos(s,index,t->length);
    return Inset(s,index,v);
}
bool RepIaceAll(Str *s,Str *t,Str *v)//在串s中查找到串t并用串v替换
{
    assert(s!=NULL);
    assert(t!=NULL);
    assert(v!=NULL);

    while(Replace(s,t,v,0));
    return true;
}
void Show(Str *s) //打印  
{
    for(int i=0;i<Getlength(s);i++)
    {
        printf("%c",s->elem[i]); 
    }
    printf("\n");
}  


int main()
{
    Str s;
    char *s1 = "abcdecdfcd";
    StrAssign(&s, s1);
    Show(&s);

    Str t;
    char *t1 = "cd";
    StrAssign(&t, t1);
    Show(&t);
    /*
    Inset(&s, 2, &t);
    Show(&s);

    Inset(&s, 7, &t);
    Show(&s);*/

    /*int index = BF(&s,&t,0);
    printf("index = %d\n",index);*/

    /*DeletePos(&s,3,2);
    Show(&s);*/

    /*Str v;
    char *v1 = "zkr";
    StrAssign(&v, v1);
    Show(&v);
    Replace(&s,&t,&v,0);
    Show(&s);*/

    Str v;
    char *v1 = "zkr";
    StrAssign(&v, v1);
    Show(&v);
    RepIaceAll(&s,&t,&v);
    Show(&s);
    system("pause");
    return 0;
}

 

#include<stdio.h>
#define maxsize 100
typedef struct{
    char A[maxsize];
    int n;
}SeqString;

void Assign(SeqString &L,char B[]){
    int i=0;
    while(B[i]!='\0'){
        L.A[i]=B[i];
        i++;
    } 
    L.n=i;
}

void DisqStr(SeqString &L){
    printf("L.B字符串为:");
    for(int i=0;i<L.n;i++){
        printf("%c",L.A[i]);
    }
    printf("\n");
}

void Strlength(SeqString &L){
    printf("字符串L.A的长度为:%d\n",L.n);
}

int  concat(SeqString &L,char C[]){
    int i=0,j;
    while(C[i]!='\0'){
        i++;
    }
    for(j=0;j<i;j++){
        L.A[j+L.n]=C[j];
    }
    printf("将串C连接到L.A后得到的字符串为:%s\n",L.A);
    return i;
}

void StrEqual(SeqString &L,char C[],int i){
    int k=0,a;
    a=L.n>=i?L.n:i;
    printf("比较L.A和B的字符串大小!(L.A等于C输出0,L.A大于C输出1,L.A小于C输出-1)\n");
    for(int j=0;j<a;j++){
        if(L.A[j]==C[j]){
            k++;
        }else if(L.A[j]>C[j]){
            printf("1\n");
            break; 
        }else {
            printf("-1\n");
            break;
        }
    }
    if(k==a){
        printf("0\n");
    }
    }

void InsStr(SeqString &L,int n,int m){
    int i;
    printf("L.A字符串第%d个位置开始的第%d个字符为:",n,m);
    for(i=n-1;i<n+m-1;i++){
        printf("%c",L.A[i]);
    }
    printf("\n");
}

void DelStr(SeqString &L,int n,int m){
    int i;
    L.n=L.n-m;
    for(i=n;i<=L.n;i++){
        L.A[i-1]=L.A[i+m-1];
    }
    printf("删除第%d个位置的%d个字符之后组成新的字符串为:",n,m);
    for(i=0;i<L.n;i++){
        printf("%c",L.A[i]);
    } 
}

void InStr(SeqString &L,int n,int m,char C[]){
    int a[L.n-n+1]; 
    for(int i=0;i<L.n-n+1;i++){
            a[i]=L.A[i+n-1];
    }  
    for(int i=0;i<m;i++){
        L.A[i+n-1]=C[i];
    }
    for(int i=0;i<L.n-n+1;i++){
        L.A[n+m-1+i]=a[i];
    }    
    L.n=L.n+m;
    printf("将C插在L.A的第%d个位置构成的字符串为:",n);
    for(int i=0;i<L.n;i++){
        printf("%c",L.A[i]);
    }
    printf("\n");
}

void Find (SeqString &L,char D[]){
    int n=0,i,j,k;
    while(D[n]!='\0'){
        n++ ; 
    }
    for(i=0;i<L.n-n;i++){
       for(j=0,k=i;j<n;j++,k++){
          if(D[j]!=L.A[k]){
            break;
        } } 
        if(j==n){
        printf("D是L.A字符串中从第%d位置到第%d的位置的字符串:\n",i+1,i+n); 
        }         
    }
    return;  
   } 

int main(){
    int i,n,m,a,b,k;
    char B[5],C[]="abcdefg",D[4]="cde";
    SeqString L;
    printf("请输入一个最大长度为5的字符串:"); 
    gets(B);
    Assign(L,B);
    DisqStr(L);
    Strlength(L);
    i=concat(L,C);
    StrEqual(L,C,i);
    printf("请输入要查找从第几个位置开始到后面的第几个字符:");
    scanf("%d %d",&n,&m);
    InsStr(L,n,m); 
    printf("请输入在第几个位置插入字符串C:");
    scanf("%d",&k);
    InStr(L,k,i,C);
    printf("请查找字符串D在L.A字符串中的位置:\n");
    Find(L,D); 
    printf("请输入要删除第几个位置开始的几个字符:");
    scanf("%d %d",&a,&b);
    DelStr(L,a,b);
    return 0;
} 
复制代码

 

 

 

 

 

 

#include<stdio.h>
#include<stdlib.h>
#define M 100
typedef struct{
    char ch[M];
    int n;
}Str;

   void Assign(Str &L,char A[]){
    int i=0;
    while(A[i]!='\0'){
        L.ch[i]=A[i];
        i++;
    } 
    L.n=i;
   }

   void DisqStr(Str &L){
    printf("字符串A为:");
    for(int i=0;i<L.n;i++){
        printf("%c",L.ch[i]);
    }
    printf("\n");
}

    void StrCopy(Str &L,char B[]){
         int i;
    for(i= 0;i<L.n;i++){
        L.B[i]=L.ch[i];
      }
      printf("B字符串为:");
    for(int i=0;i<L.n;i++){
        printf("%c",L.B[i]);
    }
      printf("\n");
     }
     
   int  concat(Str &L,char C[]){ 
    int i=0;
    while (i<L.n){
        C[i]=L.ch[i];
        i++;
    }
    int j = 0;
    while (j<L.n) {
        C[j+L.n]=L.B[j];
        j++;
    }  
    printf("将串C连接到L.A后得到的字符串为:%s\n",C[j+L.n]);
    return i;
}
void Strlength(Str &L){
    printf("字符串A的长度为:%d\n",L.n);
    printf("字符串B的长度为:%d\n",L.n);
    }

void StrEqual(Str &L,char B[],int i){
    int k=0,a;
    a=L.n>=i?L.n:i;
    printf("比较L.A和B的字符串大小!(L.A等于B输出0,L.A大于B输出1,L.A小于B输出-1)\n");
    for(int j=0;j<a;j++){
        if(L.A[j]==B[j]){
            k++;
        }else if(L.A[j]>B[j]){
            printf("1\n");
            break; 
        }else {
            printf("-1\n");
            break;
        }
    }
    if(k==a){
        printf("0\n");
    }
    }

void InsStr(Str &L,int n,int m){
    int i;
    printf("A字符串第%d个位置开始的第%d个字符为:",n,m);
    for(i=n-1;i<n+m-1;i++){
        printf("%c",L.ch[i]);
    }
    printf("\n");
}


void Find (Str &L,char D[]){
    int n=0,i,j,k;
    while(D[n]!='\0'){
        n++ ; 
    }
    for(i=0;i<L.n-n;i++){
       for(j=0,k=i;j<n;j++,k++){
          if(D[j]!=L.A[k]){
            break;
        } } 
        if(j==n){
        printf("D是L.A字符串中从第%d位置到第%d的位置的字符串:\n",i+1,i+n); 
        }         
    }
    return;  
   } 

int main(){
    int i,n,m,a,b,k;
    char A[5],C[]="abcdefg",D[4]="cde";
    Str L;
    printf("请输入一个最大长度为5的字符串:"); 
    gets(A);
    Assign(L,A);
    DisqStr(L);
    Strlength(L);
    i=concat(L,C);
    StrEqual(L,B,i);
    printf("请输入要查找从第几个位置开始到后面的第几个字符:");
    scanf("%d %d",&n,&m);
    InsStr(L,n,m); 
    printf("请输入在第几个位置插入字符串C:");
    scanf("%d",&k);
    InStr(L,k,i,C);
    printf("请查找字符串D在L.A字符串中的位置:\n");
    Find(L,D); 
    printf("请输入要删除第几个位置开始的几个字符:");
    scanf("%d %d",&a,&b);
    DelStr(L,a,b);
    return 0;
} 

 

posted on 2019-05-16 18:00  孙泽玺  阅读(937)  评论(0编辑  收藏  举报

导航