一.定义
顺序字符串是一种线性数据结构,由一组字符按顺序排列而成,通常使用字符数组实现。这种字符串的长度是其实际包含字符的数量,而不包括字符串结束符。它通常还包括一个变量用于记录最大容量,以避免溢出。
二.特点
顺序字符串的主要特点包括:
-
线性结构:顺序字符串是线性的数据结构,字符按照顺序排列,没有空间浪费。
-
长度可变:顺序字符串的长度可以根据字符的插入和删除而动态变化,因此它是可变长度的。
-
实际字符数量:字符串的长度表示实际包含的字符数量,不包括字符串结束符。
-
最大容量:通常会有一个变量用于记录字符串的最大容量,以避免溢出。
-
常见操作:支持常见的字符串操作,如构建字符串、复制、拼接、比较、搜索、插入和删除字符等。
这些特点使顺序字符串成为C语言中常用的字符串数据结构,但需要小心控制字符串的长度,以避免溢出和内存问题。
三.基本运算
-
初始化:创建一个空的顺序字符串,为其分配内存并初始化其属性,如最大容量和长度。
-
赋值:将一个字符串的内容复制到另一个顺序字符串中。
-
拼接:将一个字符串连接到另一个字符串的末尾,形成一个新的字符串。
-
比较:比较两个字符串,通常用于确定它们是否相等或哪个字符串在字典顺序中更小。
-
获取长度:获取顺序字符串的实际字符数量,即不包括字符串结束符的长度。
-
查找子字符串:在字符串中搜索指定的子字符串,并返回子字符串第一次出现的位置。
-
插入字符:在字符串的指定位置插入一个字符或一段字符。
-
删除字符:从字符串中删除指定位置的字符或一段字符。
这些基本运算是处理顺序字符串时最常见的操作。它们允许您构建、操作和比较字符串,以满足不同的应用需求。在C语言中,这些操作通常使用字符数组和相应的字符串处理函数来实现。
四.代码实现
1.定义接口
/*
sstring.h
顺序字符串
*/
typedef struct
{
char* data;
int max;
int len;
}sstring;
/*初始化串*/
int init(sstring *S, int max);
/*从字符常量拷贝*/
int sstrcpy(sstring *S, char* from);
/*模式匹配*/
int sstrmatch(sstring *S, sstring *sub);
//串比较
int sstring_compare(const sstring* s1, const sstring* s2);
//串长
int slength(sstring* str);
//串的拼接
void strcat_sstring(sstring* s1, sstring* s2);
2.初始化
/*初始化串*/
int init(sstring *S, int max)
{
S->data = (char*)malloc(sizeof(char)*max);
if(!S->data)
{
printf("申请内存失败!1000");
return 1000;
}
S->max = max;
S->len = 0;
}
3.从字符常量拷贝
/*从字符常量拷贝*/
int sstrcpy(sstring *S, char* from)
{
int i;
int len = strlen(from);
if(len>S->max)
{
printf("超出了字符串S的长度!1001\n");
return 1001;
}
for(i=0;i<len;i++)
{
S->data[i] = from[i];
}
S->data[i] = '\0';
S->len = len;
return 0;
}
4.模式匹配
/*模式匹配*/
int sstrmatch(sstring *S, sstring *sub)
{
int i, j, k;
int m = S->len;
int n = sub->len;
for(i=0;i<=m-n;i++)
{
j=0;
k=i;
while(j<n && S->data[k] == sub->data[j])
{
j++;
k++;
}
if(j==n)
{
return i;
}
}
return -1;
}
5.串比较
//串比较
int sstring_compare(const sstring* s1, const sstring* s2)
{
int i;
int result;
// 比较两个字符串的长度
if (s1->len < s2->len) {
return -1;
} else if (s1->len > s2->len) {
return 1;
}
// 长度相等,比较每个字符
for (i = 0; i < s1->len; i++) {
if (s1->data[i] < s2->data[i]) {
return -1;
} else if (s1->data[i] > s2->data[i]) {
return 1;
}
}
// 字符串相等
return 0;
}
6.串长
int slength(sstring* str) {
return str->len;
}
7.串的拼接
//串的拼接
void strcat_sstring(sstring* s1, sstring* s2) {
if (s1->len + s2->len > s1->max) {
s1->data = (char*)realloc(s1->data, (s1->len + s2->len + 1) * sizeof(char));
s1->max = s1->len + s2->len + 1;
}
strcat(s1->data + s1->len, s2->data);
s1->len += s2->len;
}
五.运行截图
六.完整代码
1.sstring.h
/*
sstring.h
顺序字符串
*/
typedef struct
{
char* data;
int max;
int len;
}sstring;
/*初始化串*/
int init(sstring *S, int max);
/*从字符常量拷贝*/
int sstrcpy(sstring *S, char* from);
/*模式匹配*/
int sstrmatch(sstring *S, sstring *sub);
//串比较
int sstring_compare(const sstring* s1, const sstring* s2);
//串长
int slength(sstring* str);
//串的拼接
void strcat_sstring(sstring* s1, sstring* s2);
2.sstring.c
/*
sstring.c
*/
#include "sstring.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
/*初始化串*/
int init(sstring *S, int max)
{
S->data = (char*)malloc(sizeof(char)*max);
if(!S->data)
{
printf("申请内存失败!1000");
return 1000;
}
S->max = max;
S->len = 0;
}
/*从字符常量拷贝*/
int sstrcpy(sstring *S, char* from)
{
int i;
int len = strlen(from);
if(len>S->max)
{
printf("超出了字符串S的长度!1001\n");
return 1001;
}
for(i=0;i<len;i++)
{
S->data[i] = from[i];
}
S->data[i] = '\0';
S->len = len;
return 0;
}
/*模式匹配*/
int sstrmatch(sstring *S, sstring *sub)
{
int i, j, k;
int m = S->len;
int n = sub->len;
for(i=0;i<=m-n;i++)
{
j=0;
k=i;
while(j<n && S->data[k] == sub->data[j])
{
j++;
k++;
}
if(j==n)
{
return i;
}
}
return -1;
}
//串比较
int sstring_compare(const sstring* s1, const sstring* s2)
{
int i;
int result;
// 比较两个字符串的长度
if (s1->len < s2->len) {
return -1;
} else if (s1->len > s2->len) {
return 1;
}
// 长度相等,比较每个字符
for (i = 0; i < s1->len; i++) {
if (s1->data[i] < s2->data[i]) {
return -1;
} else if (s1->data[i] > s2->data[i]) {
return 1;
}
}
// 字符串相等
return 0;
}
//串长
int slength(sstring* str) {
return str->len;
}
//串的拼接
void strcat_sstring(sstring* s1, sstring* s2) {
if (s1->len + s2->len > s1->max) {
s1->data = (char*)realloc(s1->data, (s1->len + s2->len + 1) * sizeof(char));
s1->max = s1->len + s2->len + 1;
}
strcat(s1->data + s1->len, s2->data);
s1->len += s2->len;
}
3.main.c
#include <stdio.h>
#include "sstring.h"
#include <string.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
sstring S;
sstring sub;
int index;
char str1[100];
char str2[100];
int cmd;
int result;
char welcome[] = "欢迎使用";
int i = 0;
int m = 0;
int n = 0;
for(i=0;i<strlen(welcome);i++)
{
printf("%c",welcome[i]);
for(m=0;m<10000;m++)
for(n=0;n<1000;n++)
{
;
}
}
printf("\n\n\n");
do
{
printf("-----------串演示-----------\n");
printf(" 1. 初始化\n");
printf(" 2. 输入串\n");
printf(" 3. 从字符常量拷贝\n");
printf(" 4. 模式匹配\n");
printf(" 5. 串比较\n");
printf(" 6. 串长\n");
printf(" 7. 输出串\n");
printf(" 8. 串的拼接\n");
printf(" 9. 帮助\n");
printf(" 0. 退出\n");
printf(" 请选择(0~9):");
scanf("%d",&cmd);
switch(cmd){
case 1:
init(&S, 1000);
init(&sub, 100);
printf("初始化成功!\n");
break;
case 2:
printf("请输入主串:");
scanf("%s", str1);
printf("请输入子串:");
scanf("%s", str2);
break;
case 3:
sstrcpy(&S, str1);
sstrcpy(&sub, str2);
printf("从字符常量拷贝已完成!\n");
break;
case 4:
index = sstrmatch(&S,&sub);
if(index>=0)
{
printf("匹配成功,子串在主串的%d位置\n", index);
}
else
{
printf("主串中不存在子串!\n");
}
break;
case 5:
if(sstring_compare(&S,&sub) == 1){
printf("主串的长度大于子串的长度\n");
}else if(sstring_compare(&S,&sub) == -1){
printf("主符串的长度小于子串的长度\n");
}
else if(sstring_compare(&S,&sub) == 0){
printf("两个字符串相等\n");
}
else printf("主串和子串的长度相等但字符不一样\n");
break;
case 6:
printf("主串:%s的长度为%d\n",str1,slength(&S));
printf("子串:%s的长度为%d\n",str2,slength(&sub));
break;
case 7:
printf("主串打印:%s,",S.data);
printf("子串打印:%s\n",sub.data);
break;
case 8:
strcat_sstring(&S, &sub);
printf("主串和子串的拼接:%s\n",S.data);
break;
case 9:
printf("本程序由邵毅豪开发\n");
break;
}
}while(cmd!=0);
return 0;
}
六.小结
顺序字符串是一种基本的字符串数据结构,通常由字符数组组成,字符按照顺序排列。以下是关于顺序字符串的小结:
-
定义:顺序字符串是线性结构,由字符数组构成,字符按顺序排列。
-
特点:顺序字符串的长度是实际包含的字符数量,不包括字符串结束符(通常是 '\0')。它具有可变长度,最大容量限制以防止溢出。
-
常见操作:支持常见字符串操作,如初始化、赋值、拼接、比较、获取长度、查找子字符串、插入字符和删除字符等。
-
实现:在C语言中,顺序字符串通常通过字符数组和标准字符串处理函数来实现。
-
注意事项:在使用顺序字符串时,需要小心控制字符串的长度,以避免溢出和内存问题。
-
常用场景:顺序字符串常用于C语言中的字符串处理,如文件操作、文本处理、用户输入、数据解析等。
总之,顺序字符串是一种简单而常见的字符串数据结构,适用于许多C语言中的字符串处理需求。理解其特点和基本操作对于有效地操作和处理字符串非常重要。