字符串的详解

字符串的详解串是由零个或多个字符组成的有限序列 在计算机科学中是一种重要的数据类型

大家好,欢迎来到IT知识分享网。

一、字符串的定义

1.1字符串的定义

串是由零个或多个字符组成的有限序列,在计算机科学中是一种重要的数据类型。字符可以是字母、数字、符号等,对应于计算机中的编码。串可以用来表示文本、图像、音频等数据

1.2字符串的特点

串是由一系列字符组成的数据结构,具有以下特点:

  • 顺序性:串中的每个字符都有一个确定的位置,按照一定的次序排列。
  • 可变性:串的长度可以根据需要进行改变,可以动态地添加或删除字符。
  • 不可变性:一旦串被创建,其中的字符就不能被修改。
  • 常用操作:串的常用操作包括查找、插入、删除、替换、比较、拼接等。

二、字符串的定义实现与使用

2.1字符串的接口定义

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 sstrcmp(const sstring* s1, const sstring* s2); //串长 int sstrlen(sstring* str); //串的联接 void sstrcat(sstring* s1, sstring* s2); 

2.2字符串的实现

2.2.1字符串初始化
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; }
2.2.2字符串拷贝
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; }
2.2.3字符串模式匹配
int sstrmatch(sstring *S, sstring *sub) { int i, j, k; int m = S->len; int n = sub->len; if(S->len==0||sub->len==0){ printf("字符串为空"); return; } 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+1; } } return -1; }
2.2.4字符串比较
int sstrcmp(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; }
2.2.5字符串长度
int sstrlen(sstring* str) { return str->len; }
2.2.5字符串拼接
void sstrcat(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; }

2.3字符串的使用

#include <stdio.h> #include "sstring.h" #include <stdlib.h> #include "welcome.h" int main(int argc, char* argv[]) { sstring S; sstring sub; int index; char str1[100]; char str2[100]; int cmd,i,m,n; int result; for(i=0;i<strlen(welcome);i++) { printf("%c",welcome[i]); for(m=0;m<1000;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(sstrcmp(&S,&sub) == 1){ printf("主串的长度大于子串的长度\n"); }else if(sstrcmp(&S,&sub) == -1){ printf("主串的长度小于子串的长度\n"); } else if(sstrcmp(&S,&sub) == 0){ printf("两个字符串相等\n"); } break; case 6: printf("主串:%s的长度为%d\n",str1,sstrlen(&S)); printf("子串:%s的长度为%d\n",str2,sstrlen(&sub)); break; case 7: printf("主串打印:%s",S.data); printf("子串打印:%s\n",sub.data); break; case 8: sstrcat(&S, &sub); printf("主串和子串的拼接:%s\n",S.data); break; case 9: printf("本程序为字符串的演示程序,由黄彬森设计开发!\n"); break; } }while(cmd!=0); }

三、完整代码

3.1 main.c文件代码

#include <stdio.h> #include "sstring.h" #include <stdlib.h> #include "welcome.h" int main(int argc, char* argv[]) { sstring S; sstring sub; int index; char str1[100]; char str2[100]; int cmd,i,m,n; int result; for(i=0;i<strlen(welcome);i++) { printf("%c",welcome[i]); for(m=0;m<1000;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(sstrcmp(&S,&sub) == 1){ printf("主串的长度大于子串的长度\n"); }else if(sstrcmp(&S,&sub) == -1){ printf("主串的长度小于子串的长度\n"); } else if(sstrcmp(&S,&sub) == 0){ printf("两个字符串相等\n"); } break; case 6: printf("主串:%s的长度为%d\n",str1,sstrlen(&S)); printf("子串:%s的长度为%d\n",str2,sstrlen(&sub)); break; case 7: printf("主串打印:%s",S.data); printf("子串打印:%s\n",sub.data); break; case 8: sstrcat(&S, &sub); printf("主串和子串的拼接:%s\n",S.data); break; case 9: printf("本程序为字符串的演示程序,由黄彬森设计开发!\n"); break; } }while(cmd!=0); }

3.2  sstring.c文件代码

#include "sstring.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; if(S->len==0||sub->len==0){ printf("字符串为空"); return; } 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+1; } } return -1; } //串比较 int strcmp(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 sstrlen(sstring* str) { return str->len; } //串的拼接 void sstrcat(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.2  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 sstrcmp(const sstring* s1, const sstring* s2); //串长 int sstrlen(sstring* str); //串的联接 void sstrcat(sstring* s1, sstring* s2); 

3.4  welcome.h文件代码

char welcome[] = "\n\ | .-.\n\ | / 、 .-.\n\ | / 、 / 、 .-. .-.\n\ +--/-------、-----/-----、-----/---、---/---、---/-、-/-、/、/---\n\ | / 、 / 、 / '-' '-' \n\ |/ '-' '-' \n\ ";

四、代码运行结果

 | .-. | / 、 .-. | / 、 / 、 .-. .-. +--/-------、-----/-----、-----/---、---/---、---/-、-/-、/、/--- | / 、 / 、 / '-' '-' |/ '-' '-' -----------字符串演示----------- 1. 初始化 2. 输入串 3. 从字符常量拷贝 4. 模式匹配? 5. 串比较 6. 串长 7. 输出串 8. 串的拼接 9. 帮助 0. 退出 请选择(0~9):1 初始化成功! -----------字符串演示----------- 1. 初始化 2. 输入串 3. 从字符常量拷贝 4. 模式匹配? 5. 串比较 6. 串长 7. 输出串 8. 串的拼接 9. 帮助 0. 退出 请选择(0~9):2 请输入主串:aaaa 请输入子串:bbb -----------字符串演示----------- 1. 初始化 2. 输入串 3. 从字符常量拷贝 4. 模式匹配? 5. 串比较 6. 串长 7. 输出串 8. 串的拼接 9. 帮助 0. 退出 请选择(0~9):3 从字符复制完成! -----------字符串演示----------- 1. 初始化 2. 输入串 3. 从字符常量拷贝 4. 模式匹配? 5. 串比较 6. 串长 7. 输出串 8. 串的拼接 9. 帮助 0. 退出 请选择(0~9):5 主串的长度大于子串的长度 -----------字符串演示----------- 1. 初始化 2. 输入串 3. 从字符常量拷贝 4. 模式匹配? 5. 串比较 6. 串长 7. 输出串 8. 串的拼接 9. 帮助 0. 退出 请选择(0~9):6 主串:aaaa的长度为4 子串:bbb的长度为3 -----------字符串演示----------- 1. 初始化 2. 输入串 3. 从字符常量拷贝 4. 模式匹配? 5. 串比较 6. 串长 7. 输出串 8. 串的拼接 9. 帮助 0. 退出 请选择(0~9):8 主串和子串的拼接:aaaabbb -----------字符串演示----------- 1. 初始化 2. 输入串 3. 从字符常量拷贝 4. 模式匹配? 5. 串比较 6. 串长 7. 输出串 8. 串的拼接 9. 帮助 0. 退出 请选择(0~9):7 主串打印:aaaabbb子串打印:bbb -----------字符串演示----------- 1. 初始化 2. 输入串 3. 从字符常量拷贝 4. 模式匹配? 5. 串比较 6. 串长 7. 输出串 8. 串的拼接 9. 帮助 0. 退出 请选择(0~9):4 匹配成功,子串在主串的5位置 -----------字符串演示----------- 1. 初始化 2. 输入串 3. 从字符常量拷贝 4. 模式匹配? 5. 串比较 6. 串长 7. 输出串 8. 串的拼接 9. 帮助 0. 退出 请选择(0~9):9 本程序为字符串的演示程序,由黄彬森设计开发! -----------字符串演示----------- 1. 初始化 2. 输入串 3. 从字符常量拷贝 4. 模式匹配? 5. 串比较 6. 串长 7. 输出串 8. 串的拼接 9. 帮助 0. 退出 请选择(0~9):0 -------------------------------- Process exited after 59.68 seconds with return value 0 请按任意键继续. . .

五、小结

字符串是由0个或者多个字符组成的有限序列,一般用来表示文本,图像等的数据。

字符串基本操作如:

        串的长度:串中字符的个数,常用len(s)表示。

        串的比较:可以按字典序比较两个串的大小,常用==!=<><=>=等运算符进行比较。

        串的子串:串中任意连续的一段字符,可以通过s[i:j]表示,其中i是子串的起始位置,j是子串的终止位置+1。

        串的连接:将两个串连接在一起形成一个新的串,常用s1+s2表示。

        串的复制:将一个串复制n次形成一个新的串,常用s*n表示。

        串的查找:在一个串中查找某个子串的位置。

六、参考文献

【1】CSDN

【2】数据结构(C语言)

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/129165.html

(0)
上一篇 2025-08-26 14:20
下一篇 2025-08-26 14:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信