欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C语言实现串的顺序存储表示与基本操作

程序员文章站 2022-03-23 23:20:45
本文实例为大家分享了c语言实现串的顺序存储表示与基本操作代码,供大家参考,具体内容如下1 串的三种存储表示串,即:字符串。要注意的是,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语言实现串的顺序存储表示与基本操作

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。