服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言的堆串操作详解

C语言的堆串操作详解

2022-09-21 14:27犀牛超人 C/C++

大家好,本篇文章主要讲的是C语言的堆串操作详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下

一、堆串概念。

与定长顺序穿的存储结构类似,都是用一组地址连续的存储单元存储串的字符序列,不同的是堆串的存储空间是动态分配的,只要存储空间分配成功,就不会担心串在插入或者连接时候出现截断的情况。

 malloc(),free(),realloc()  这三个函数用来对动态存储进行操作。

二、基本操作。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define false 0
#define true 1
typedef struct {
    char *ch;    //字符数组,若是非空则指向起始地址,若为空则NULL
    int len;   //长度
}HString;
//初始化
int HInit(HString *s){
    s->ch=NULL;
    s->len=0;
}
//串赋值
int HStrAssign(HString *s,const char *chars){
    int i=0;
    while(chars[i]!='\0'){    //确定串长
        i++;
    }
    s->len=i;
    if(s->ch!=NULL){
        free(s);
    }else{
        s->ch=(char *)malloc((s->len+1)*sizeof(char));//0号单元不用
        if(s==NULL){
            printf("空间申请失败!");
            return false;
        }
    for( i=1;i<=s->len;i++){   //依次赋值
        s->ch[i]=chars[i-1];
    }
    }
}
//串遍历
int HSbianli(HString *s){
    if(s->len==0){
        printf("串空!");
        return false;
    }else{
        int i;
        for(i=1;i<=s->len;i++){
            printf("%c",s->ch[i]);
        }
        return true;
    }
}
//串插入
int HStrInsert(HString *s,int pos,const HString t){
    if(pos<1||pos>s->len){
        printf("位置不合法!");
        return false;
    }
    char *temp;
    temp=(char *)malloc((s->len+t.len+1) *sizeof(char));
    int i;
    for(i=1;i<pos;i++){    //将s串pos之前(不含pos)的字符赋给temp
        temp[i]=s->ch[i];
    }
    for(i=pos;i<pos+t.len;i++){   //将t串的元素赋给s
        temp[i]=t.ch[i-pos+1];
    }
    for(i=0;i<=s->len-pos;i++){
        temp[pos+t.len+i]=s->ch[i+pos];
    }
    free(s->ch);
    s->ch=temp;
    s->len=s->len+t.len;
    return true;
}
//串删除
int HStrDelete(HString *s,int pos,int len){
    if(s->len==0){
        printf("串空!");
        return false;
    }else if(len>=s->len){
        printf("非法位置!");
        return false;
    }else{
        for(int i=pos;i<s->len-pos;i++){   //跨度为len的依次赋值
            s->ch[i]=s->ch[i+len];
        }
        s->len=s->len-len;
        return true;
    }
}
//串连接
 int HStrCon(HString *s,const HString t){
    s->ch=(char *)realloc(s->ch,(s->len+t.len+1) *sizeof(char));
    if(s==NULL){
        printf("空间申请失败!");
        return false;
     }
    if(s->len==0){
        printf("串空!");
        return false;
    }else{
        for(int i=1;i<=t.len;i++){
            s->ch[i+s->len]=t.ch[i];
        }
        s->len=s->len+t.len;
        return true;
    }
 }
 //求字串
 int HStrchild(HString *s,int pos,int len){
    if(s->len==0){
        printf("串空!");
        return false;
     }else{
        for(int i=0;i<len;i++){
            printf("%c",s->ch[i+pos]);
         }
         return true;
     }
 }
 
int main(){
    HString s;
    HString s1;
    HInit(&s);
    HInit(&s1);
    char a[]={"aaaaa"};
    char b[]={"bbb"};
    HStrAssign(&s,a);
    HStrAssign(&s1,b);
    printf("-----将aaaaa赋值给s,bbb赋值给s1-----\n");
    printf("此时串s为:");
    HSbianli(&s);
    printf("\n此时串s1为:");
    HSbianli(&s1);
    printf("\n将s1连接到s为:");
    HStrCon(&s,s1);
    HSbianli(&s);
    printf("\n将串s1插入到s串的第二个位置:");
    HStrInsert(&s,2,s1);
    HSbianli(&s);
    printf("\n再将插入的s1串删除:");
    HStrDelete(&s,2,3);
    HSbianli(&s);
    printf("\ns1在第二个元素长度为2的子串为:");
    HStrchild(&s,2,2);
}

三、运行:

C语言的堆串操作详解

 代码可运行。

总结

到此这篇关于C语言的堆串操作详解的文章就介绍到这了,更多相关C语言堆串内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/m0_61395860/article/details/122902129

延伸 · 阅读

精彩推荐
  • C/C++MFC串口通信发送16进制数据的方法

    MFC串口通信发送16进制数据的方法

    这篇文章主要为大家详细介绍了MFC串口通信发送16进制数据,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Timmy_Y5572021-07-17
  • C/C++C++设计模式之迭代器模式

    C++设计模式之迭代器模式

    这篇文章主要介绍了C++设计模式之迭代器模式,本文讲解了什么是迭代器模式、迭代器模式的代码实例等内容,需要的朋友可以参考下...

    果冻想8782021-02-05
  • C/C++在C语言中使用对数函数的方法

    在C语言中使用对数函数的方法

    这篇文章主要介绍了在C语言中使用对数函数的方法,包括以e为底和以10为底的对数计算,需要的朋友可以参考下...

    C语言教程网10462021-03-08
  • C/C++win32 api实现简单的消息窗口示例

    win32 api实现简单的消息窗口示例

    这篇文章主要介绍了使用win32 api实现简单的消息窗口示例,需要的朋友可以参考下...

    C语言程序设计5882021-01-17
  • C/C++C++实现雷霆战机可视化小游戏

    C++实现雷霆战机可视化小游戏

    这篇文章主要为大家详细介绍了C++实现雷霆战机可视化小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    木笔#11142021-10-07
  • C/C++最大子矩阵问题实例解析

    最大子矩阵问题实例解析

    这篇文章主要介绍了最大子矩阵问题实例解析,分别列举了Java和C语言的相关实现,需要的朋友可以参考下...

    zinss269146832021-03-06
  • C/C++C++实操之内联成员函数介绍

    C++实操之内联成员函数介绍

    大家好,本篇文章主要讲的是C++实操之内联成员函数介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览...

    夜流冰10372022-07-22
  • C/C++C++中的模板template小结

    C++中的模板template小结

    这篇文章主要介绍了C++中的模板template的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可...

    醉曦5682021-08-26