MENU

[C++]串的基本操作实现及应用

October 28, 2019 • Read: 228 • 程序笔记

前言

这次是数据结构课程中第四次实验报告的题目,本次实验报告主要是学习串的操作,实现字符的匹配,下面总结一下我遇到的问题。
Snipaste_2019-10-28_08-59-02.png

题目

录入S串,录入T串,将T串于S串进行比对,匹配出S串中有多少个T串,并输出第一个T串的位置。最后输入要删除字符串的位置和数量,进行删除操作。

运行结果

Snipaste_2019-10-28_08-53-31.png

代码

#include <iostream>
#include <cstring> //strlen函数需要的头文件
#define maxsize 100
using namespace std;
typedef struct{
    char *ch;
    int length;
}HSting;

void Init_String(HSting &S){
    S.length = 0;
    S.ch = (char *)malloc(maxsize*sizeof(char)); //分配内存
    if(!S.ch)
        cout<<"空间分配失败!\n";
    else{
        cin>>S.ch;
        S.length = strlen(S.ch); //strlen函数的作用:求字符串的长度
    }
}

int index_string(HSting S,HSting T,int pos) {
    int i,j;
    i = pos;
    j = 0;
    while(i<S.length&&j<T.length){
        if(S.ch[i]==T.ch[j]){
            ++i;
            ++j;
        }
        else{
            i = i-j+2;
            j = 1;
        }
    }
    if(j>=T.length)
        return i;
    else
        return  0;
}

int count_string(HSting S,HSting T,int pos){
    int count = 0;
    while(pos = index_string(S,T,pos))
        count++;
    return count;
}

void delete_string(HSting &S,int pos,int m){
    for(int i=pos+m-1;i<=S.length+1;i++)
        S.ch[i-m] = S.ch[i];
    S.length = S.length-m;
}

int main() {
    HSting S,T;
    int pos=0,m;
    cout<<"输入S串:"<<endl;
    Init_String(S);
    cout<<"输入T串:"<<endl;
    Init_String(T);
    pos = index_string(S,T,pos);
    if(pos==0)
        cout<<"T不在S中"<<endl;
    else
        cout<<"第一个T在S的第"<<pos-T.length+1<<"位置"<<endl;
    pos = 0;
    cout<<"T在S中有"<<count_string(S,T,pos)<<"个"<<endl;
    cout<<"请输入删除的位置和长度"<<endl;
    cin>>pos>>m;
    delete_string(S,pos,m);
    cout<<"删除后的子串:"<<S.ch<<endl;
    return 0;
}

错误总结

1.使用了strlen函数未定义cstring头文件
2.忘了S.ch分配内存导致找不到错误在哪,只知道在串初始化那边错了,然后参考了百度上面一些文章,了解流程后对内存进行分配。
3.在后面删除字符串功能中,因为忽略了输入的数量变量m,导致只删除了一个字符,后面发现问题,改正好了。

Archives QR Code Tip
QR Code for this page
Tipping QR Code
Leave a Comment

2 Comments
  1. 萌新百科 萌新百科

    试试评论邮件

    1. @萌新百科回复看看