大家好,欢迎来到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