这篇文章主要为大家详细介绍了C语言实现串的顺序存储表示与基本操作,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了C语言实现串的顺序存储表示与基本操作代码,供大家参考,具体内容如下
1、串的三种存储表示
串,即:字符串。要注意的是,C语言中是没有字符串数据类型的,而将其作为一种数据结构——“内容受限的线性表”进行实现,并对空串、空格串、串的长度、子串与主串等概念进行了约定【详见 《数据结构(C语言版)》 ,严蔚敏、吴伟民编著】 。
串的存储表示主要分为三种:
【1】顺序存储表示 :使用字符型数组(一块连续的内存存储空间)来存储串的内容,其最大长度已经定义则不可修改;(这也是C语言中初始约定好的一种较为字符串内容的表示方式)
【2】堆分配存储表示:使用malloc和free函数对堆区进行操作,进行堆区内存的动态分配与释放,而这块存储空间就用于存储串的内容;
【3】块链存储表示:即采用链表的形式,通过指针,将位于不同存储空间的多个字符串“碎片”进行连接,“拼凑”成为一个完整的串
在此只介绍第一种,即:串的顺序存储表示。
2、串的顺序存储表示与基本操作
这部分就直接贴代码了
【因为这里是对数组元素的操作,就偷个懒,直接用了C语言string.h头文件中提供的一些库函数,对一些基本操作进行了简单实现。需要详细写代码的部分到串的堆分配实现时候再体现】
2.1 头文件声明
/**
* 串的顺序存储实现
*/
#include <string.h>
#define MAXLEN 255
//结构体定义-表示串结构体
typedef struct{
char ch[MAXLEN+1];//存储串内容的字符型数组[+1是为了存储结束标志'\0']
int length;//当前串的长度
}SString;
/**
* 将字符串T复制为chars
*/
int StrAssignS(SString* T,char* chars);
/**
* 获取字符串长度
*/
int StrLengthS(SString T);
/**
* 字符串的判空操作
*/
int StrIsEmptyS(SString T);
/**
* 串连接操作
*/
int StrConcatS(SString* T,char* s1,char* s2);
/**
* 截取子串
*/
int SubStringS(SString* T,SString src,int pos,int len);
/**
* 串清空
*/
int ClearStringS(SString* T);
/**
* 串比较
*/
int StrCompareS(SString T1,SString T2);
2.2 函数实现
#include "SString.h"
/**
* 将字符串T复制为chars
*/
int StrAssignS(SString* T,char* chars){
//清空原始内容
memset(T->ch,0,MAXLEN);
T->length=0;
//重新赋值为chars
strcpy(T->ch,chars);
T->length=(int)strlen(chars);
/*printf("len=%d\n",strlen(T->ch));*/
return 0;
}
/**
* 字符串的判空操作
*/
int StrIsEmptyS(SString T){
return T.length==0;
}
/**
* 获取字符串长度
*/
int StrLengthS(SString T){
return T.length;
}
/**
* 串连接操作
*/
int StrConcatS(SString* T,char* s1,char* s2){
//辅助变量
char *p;
//清空T中的内容
memset(T->ch,0,MAXLEN);
T->length=0;
//连接字符串
p=strcat(s1,s2);
//字符串连接到T中
strcpy(T->ch,p);
T->length=(int)strlen(p);
return 1;
}
/**
* 截取子串
*/
int SubStringS(SString* T,SString src,int pos,int len){
//清空T中的原始内容
memset(T->ch,0,MAXLEN);
T->length=0;
//获取子串
/**
char *strncpy(char *dest, const char *src, size_t n)
dest -- 指向用于存储复制内容的目标数组
src -- 要复制的字符串
n -- 要从源中复制的字符数
*/
strncpy(T->ch,src.ch+pos,len);
//重新设置串的长度
T->length=len;
return 1;
}
/**
* 串比较
*/
int StrCompareS(SString T1,SString T2){
/*
int strcmp(const char *str1, const char *str2)
如果返回值小于 0,则表示 str1 小于 str2
如果返回值大于 0,则表示 str1 大于 str2
如果返回值等于 0,则表示 str1 等于 str2
*/
return strcmp(T1.ch,T2.ch);
}
/**
* 串清空
*/
int ClearStringS(SString* T){
memset(T->ch,0,MAXLEN);
T->length=0;
return 1;
}
2.3 函数测试
#include <stdio.h>
#include <stdlib.h>
#include "SString.h"
int main(int argc,char **argv){
SString str1,str2;
//str1.ch="Hello,World!";
StrAssignS(&str1,"Hello,World");
StrAssignS(&str2,"Hello");
printf("len=%d\n",StrLengthS(str1));
//字符串连接
StrConcatS(&str1,"SHello","Hi");
printf("len=%d\n",StrLengthS(str1));
//打印字符串内容
printf("str1=%s\n",str1.ch);
printf("str2=%s\n",str2.ch);
printf("CompareRes=%d\n",StrCompareS(str1,str2));
//截取子串
SubStringS(&str2,str1,2,3);
puts(str1.ch);
puts(str2.ch);
//清空字符串内容
ClearStringS(&str1);
printf("str1's len=%d,str2's len=%d,\nso str1 isEmpty:%d,str2 isEmpty:%d\n",StrLengthS(str1),StrLengthS(str2),StrIsEmptyS(str1),StrIsEmptyS(str2));
return 0;
}
贴上测试结果的截图:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程学习网。
本文标题为:C语言实现串的顺序存储表示与基本操作
基础教程推荐
- 如何C++使用模板特化功能 2023-03-05
- 详解c# Emit技术 2023-03-25
- C利用语言实现数据结构之队列 2022-11-22
- C++中的atoi 函数简介 2023-01-05
- 一文带你了解C++中的字符替换方法 2023-07-20
- C/C++编程中const的使用详解 2023-03-26
- C语言 structural body结构体详解用法 2022-12-06
- C++使用easyX库实现三星环绕效果流程详解 2023-06-26
- C语言基础全局变量与局部变量教程详解 2022-12-31
- C++详细实现完整图书管理功能 2023-04-04