串的应用举例

假设串S1 = "I come from Beijing",S2 = "Chongqing" ,Sub = "America".

利用串的基本操作,如果串的赋值、串的插入、串的删除、串的替换、对上面

的串进行操作

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

#define MAXSIZE 60
typedef struct
{
    char str[MAXSIZE];
    int length;
}SeqString;  

void StrAssign(SeqString *S,char cstr[]);//串的赋值操作
int StrEmpty(SeqString S);//判断串是否为空
int StrLength(SeqString S);//求串的长度操作
void StrCopy(SeqString *T,SeqString S);//串的复制操作
int StrCompare(SeqString S,SeqString T);//串的比较操作
int StrInsert(SeqString *S,int pos,SeqString T);//串的插入操作
int StrDelete(SeqString *S,int pos,int len);//串的删除操作
int StrConcat(SeqString *T,SeqString S);//串的连接操作
int SubString(SeqString *Sub,SeqString S,int poos,int len);//截取子串操作
int StrReplace(SeqString *S,SeqString T,SeqString V);//串的替换操作
int StrIndex(SeqString S,int pos,SeqString T);//串的定位操作
void StrClear(SeqString *S);//清空串操作
void StrPrint(SeqString S);//串的输出声明  

#include "string.h"  

int main(void)
{
    SeqString S1,S2,Sub;
    char ch[MAXSIZE];
    printf("请输入第一个字符串:\n");
    gets(ch);
    StrAssign(&S1,ch);
    printf("输出串S1:");
    StrPrint(S1);
    printf("请输入第二个字符串:\n");
    gets(ch);
    StrAssign(&S2,ch);
    printf("输出串S2:");
    StrPrint(S2);
    printf("将串S2插入到S1的第13个位置:\n");
    StrInsert(&S1,13,S2);
    StrPrint(S1);
    printf("将串S1中的第22个位置起的7个字符删除:\n");
    StrDelete(&S1,22,7);
    StrPrint(S1);
    printf("将串S2中的第6个位置起的4个字符取出放进Sub中:\n");
    SubString(&Sub,S2,6,4);
    StrPrint(Sub);
    printf("将串Sub赋值为America:\n");
    StrAssign(&Sub,"America");
    printf("将串S1中的串S2用Sub取代:\n");
    StrReplace(&S1,S2,Sub);
    StrPrint(S1);
    return 0;
}  

#include "string.h"  

void StrAssign(SeqString *S,char cstr[])//串的赋值操作(将常量cstr中的字符赋值给串S)
{
    int i = 0;
    for(i = 0;cstr[i]!='\0';i++)
    {
        S->str[i] = cstr[i];
    }
    S->length = i;
}
int StrEmpty(SeqString S)//判断串是否为空
{
    if(S.length == 0)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
int StrLength(SeqString S)//求串的长度操作
{
    return S.length ;
}
void StrCopy(SeqString *T,SeqString S)//串的复制操作(将串S中的每一个字符赋给T)
{
    int i;
    for(i = 0;i < S.length ;i++)
    {
        T->str[i] = S.str[i];
    }
    T->length = S.length ;
}
int StrCompare(SeqString S,SeqString T)//串的比较操作
{
    int i;
    for(i = 0;i < S.length&&i < T.length ;i++)//比较两个串中的字符
    {
        if(S.str[i] != T.str[i])//如果出现字符不同,则返回两个字符的差值
        {
            return (S.str[i]-T.str[i]);
        }
    }
    return (S.length - T.length);//如果比较完毕,返回两个字符串的长度的差值
}
int StrInsert(SeqString *S,int pos,SeqString T)//串的插入操作(在串S的pos个位置插入串T)
{
    int i;
    if(pos < 0 || pos-1 > S->length)
    {
        printf("插入位置不正确\n");
        return 0;
    }
    if(S->length + T.length <= MAXSIZE)//子串完整插入到串中
    {
        //在插入子串T前,将S中的pos后的字符向后移动len个位置
        for(i = S->length+T.length-1;i >= pos+T.length-1;i--)
        {
            S->str[i] = S->str[i-T.length];
        }
        //将串插入到S中
        for(i = 0;i < T.length ;i++)
        {
            S->str[pos+i-1] = T.str[i];
        }
        S->length = S->length +T.length ;
        return 1;
    }
    else if(pos +T.length <= MAXSIZE)//子串完全插入S中,但是S中的字符会被截断
    {
        for(i = MAXSIZE-1;i > T.length +pos-1;i--)
        {
            S->str[i] = S->str[i-T.length];
        }
        for(i = 0;i < T.length ;i++)
        {
            S->str[i+pos-1] = T.str[i];
        }
        S->length = MAXSIZE;
        return 0;
    }
    else//子串T不能完全插入到S中,T将会有字符被舍弃
    {
        for(i = 0;i < MAXSIZE-pos;i++)
        {
            S->str[i+pos-1] = T.str[i];
        }
        S->length = MAXSIZE;
        return 0;
    }
}
int StrDelete(SeqString *S,int pos,int len)//串的删除操作(在串S中删除pos开始的len个字符,然后将后面的字符向前移动)
{
    int i,flag;
    if(pos < 0 || len < 0 || pos+len-1 > S->length)
    {
        printf("删除位置不正确,参数len不合法\n");
        flag = 0;
    }
    else
    {
        for(i = pos+len;i <= S->length-1;i++)
        {
            S->str[i-len] = S->str[i];
        }
        S->length = S->length -len;//修改串S的长度
        flag = 1;
    }
    return flag;
}
int StrConcat(SeqString *T,SeqString S)//串的连接操作(将串S连接在串T的后面)
{
    int i,flag;
    if(T->length +S.length <= MAXSIZE)
    {
        for(i = T->length ;i < T->length +S.length ;i++)
        {
            T->str[i] = S.str[i-T->length];
        }
        T->length = T->length +S.length ;
        flag = 1;
    }
    else if(T->length < MAXSIZE)
    {
        for(i = T->length ;i < MAXSIZE;i++)
        {
            T->str[i] = S.str[i-T->length];
        }
        T->length = MAXSIZE;
        flag = 0;
    }
    return flag;
}
int SubString(SeqString *Sub,SeqString S,int pos,int len)//截取子串操作(截取串S中从第pos个字符开始,长度为len的连续字符,并赋值给Sub)
{
    int i;
    if(pos < 0 || len < 0 || pos+len-1 > S.length)
    {
        printf("参数pos和len不合法\n");
        return 0;
    }
    else
    {
        for(i = 0;i < len;i++)
        {
            Sub->str[i] = S.str[i+pos-1];
        }
        Sub->length = len;
        return 1;
    }
}
int StrIndex(SeqString S,int pos,SeqString T)//串的定位操作(在主串S中的第pos个位置开始查找子串T,如果主串S中存在与串T值相等的子串,返回子串在主串第pos个字符后第一次出现的位置)
{
    int i,j;
    if(StrEmpty(T))
    {
        return 0;
    }
    i = pos;
    j = 0;
    while(i < S.length && j < T.length)
    {
        if(S.str[i] == T.str[j])
        {
            i++;
            j++;
        }
        else//如果当前对应位置的字符不相等,则从串S的下一个字符开始,从T的第0个字符开始比较
        {
            i = i-j+1;
            j = 0;
        }
    }
    if(j >= T.length)//如果在串S中找到串T,则返回子串T在主串S中的位置
    {
        return i-j+1;
    }
    else
    {
        return -1;
    }
}
int StrReplace(SeqString *S,SeqString T,SeqString V)//串的替换操作(如果串S中存在子串T,则用V替换串S中的所有子串T)
{
    int flag;
    int i = 0;
    if(StrEmpty(T))
    {
        return 0;
    }
    while(i)
    {
        i = StrIndex(*S,i,T);//利用串的定位操作在串S中查找T的位置
        if(i)
        {
            StrDelete(S,i,StrLength(T));//如果找到子串T,则将S中的串T删除
            flag = StrInsert(S,i,V);//将V插入
            if(!flag)
            {
                return 0;
            }
            i += StrLength(V);
        }
    }
    return 1;
}
void StrClear(SeqString *S)//清空串操作
{
    S->length = 0;
}
void StrPrint(SeqString S)//串的输出声明
{
    int i;
    for(i = 0;i < S.length ;i++)
    {
        printf("%c",S.str[i]);
    }
    printf("\n");
}  

运行结果:

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 05:39:54

串的应用举例的相关文章

第四章:2.串 -- 串的模式匹配算法(KMP)

前言: 目录: 1.串类型的定义 2.串的表示和实现 3.串的模式匹配算法 4.串操作应用举例 正文: 串的模式匹配即,在给定主串S 中,搜索子串T 的位置,如果存在T 则返回其所在位置,否则返回 0 串的模式匹配算法 主串 S: a b c a b c d s v t 子串 T: a b c d 一.原始算法 匹配一旦失败,子串即向右移动一个单位,直到完全匹配停止. 第一次匹配:(注:红色代表不匹配(失配)) S: a b c a b c a b c d s v t   T: a b c d

大话数据结构之四(串)

串的定义 串是由零个或多个字符组成的有限序列,又名叫字符串 串中的字符数目n称为串的长度 零个字符的串称为空串 串的抽象数据类型 串的顺序存储结构 串我链式存储结构 一个结点可以存储一个字符也可以考虑存储多个字符,最后一个结点若是未被占满时,可以用#或其它非串值字符补全 朴素的模式匹配算法 对主串的每一个字符作为子串开头,与要匹配的字符进行匹配.对主串做大循环,每个字符开头做T的长度的小循环,直到匹配成功或全部遍历完成为止. 时间复杂度为O(n+m) /* 返回子串T在主串S中第pos个字符之后

JavaScript--字符串常用方法总结

JavaScript--字符串常用方法总结 举例模板: var str = "what are you " var str1 = "sss" var txt = str.方法(参数1,参数2...) console.log(txt) 1.charAt(索引):根据索引,返回字符串中指定的字符串 var txt = str.charAt(5) 2.charCodeAt(索引):根据索引,返回字符串中指定字符串的ASCII编码 var txt = str.charCod

Linux学习

Linux严格区分大小写: Linux所有内容以文件形式保存,包括硬件 Linux不靠扩展名区分文件类型 配置文件 *.conf   *.cf Linux所有的存储设备必须都挂载之后用户才能使用,包括硬盘.U盘和光盘 挂载:分配盘符的过程 远程登录管理工具:secureCRT Ifconfig 网卡 eth0 服务器注意:a.远程服务器不允许关机,只能重启 b重启时应该关闭服务 C 不要在服务器访问高峰运行高负载命令 d Linux常用命令 文件处理命令 1.1命令格式与目录处理命令ls 命令:

数据结构和离散数学目录

第3章 栈和队列 3.1 栈 3.2 栈的应有和举例 3.3 栈与递归的实现 3.4 队列 3.5 离散事件模拟第4章 串 4.1 串类型的定义 4.2 串的表示和实现 4.3 串的模式匹配算法 4.4 串操作应用举例第5章 数组和广义表 5.1 数组的定义 5.2 数组的顺序表现和实现 5.3 矩阵的压缩存储 5.4 广义表的定义 5.5 广义表的储存结构 5.6 m元多项式的表示 5.7 广义表的递归算法第6章 树和二叉树6.1 树的定义和基本术语6.2 二叉树 6.2.1 二叉树的定义 6

c++ string详解 assign

assign方法可以理解为先将原字符串清空,然后赋予新的值作替换. 返回类型为 string类型的引用.其常用的重载也有下列几种: a. string& assign ( const string& str ); 将str替换原字串的内容 举例: string testassign = "Hello World"; testassign.assign("Go home"); cout<<testassign<<endl; //

Linux 下搭建流媒体服务器

http://blog.csdn.net/huangtaishuai/article/details/9836581 本文说明如何在 CentOS 6 服务器(无图形界面)搭建以 VLC 为核心的直播流媒体服务器. 第一步,安装第三方 yum 源.因为官方 yum 源中是不包含 VLC 安装包的,为了不用考虑安装包之间的依赖关系,使用第三方yum源的 yum 安装方式,能极大地简化 vlc 的安装过程,将主要精力集中到如何使用 VLC 功能来搭建流媒体服务器.(如果不想使用 yum 安装的,请自

CSUST 8.4 早训

## Problem A A - Memory and Crow CodeForces - 712A 题意: 分析可得bi=ai+ai+1 题解: 分析可得bi=ai+ai+1 C++版本一 #include<bits/stdc++.h> using namespace std; const int maxn = 1e5 + 7; int a[maxn]; int main(int argc, char const *argv[]) { int n; cin >> n ; for(

数据结构知识框架

数据结构 本博文纯手打,待完善,不定期更新 线性表 线性表的类型定义 线性表 (linear_list)是最常用且最简单的一种数据结构.简言之,一个线性表是n个数据元素的有限序列. 一个数据结构可以由若干个 数据项 (item)组成.在这种情况下,常把数据元素称为 记录 (record),含有大量记录的线性表又称为 文件 (file). 综上: 线性表中的数据元素可以是各式各样的,但同一线性表中的元素必定具有相同特性,即属于同一数据对象,相邻数据元素之间存在着序偶关系.若将线性表记为 (a1,