一. 串的定义
串是由零个或者多个字符组成的有限序列。串中任意连续的字符组成的子序列称为该串的字串,包含字串的串称为主串。
在C语言中,串可以使用如下语句定义:
char str[] = "Hello World!";
上面的串里面一共有12个字符,但是编译器以 ‘\0’ 作为字符串结束标志,所以数组str的长度为13,串str的长度为12。
二. 串的存储结构
-
定长顺序表示:
串的定长顺序表示指的是采用一个固定长度的数组来存储串,但是并不像上面那样直接定义,而是额外定义一个变量存储所存储数组中串的长度。typedef struct { char str[MaxSize +1];//MaxSize为串的最大长度,定义为+1是因为最后存储'\0'作为字符串结束标记 int Length; }str;
-
变长分配存储表示
变长分配存储表示(又叫动态分配存储表示)是指定义一个指向存储区的首地址的指针,根据需要不断申请内存来存储串。typedef struct{ char *ch; //指向动态分配存储区首地址的指针 int length; //串的长度 }Str;
三. 串的基本操作
-
赋值操作
int strassign(Str *S, char *ch){ //将串ch保存在S所指的空间 int len = 0,i=0; char *c = ch; if(S->ch) free(S->ch); //释放原串空间 while(*c){ //求串长度 ++len; ++c; } if(len == 0){ //若串长为零直接返回空串 S->ch = NULL; S->length = 0; return OK; } else{ S->ch = (char *)malloc((len+1)*sizeof(char));//分配串长+'\0'的空间 if(S->ch == NULL) return ERROR; //内存分配失败 else{ c = ch; //重新指向首地址 for(i=0;i<len+1;++i){ S->ch[i] = *c; ++c; } //将字符串赋值 S->length = len; return OK; } } }
-
串比较操作
int strcompare(Str s1, Str s2){ //比较s1、s2两个串,返回 1\2 int i=0; while(i<s1.length && i<s2.length){ if(s1.ch[i] > s2.ch[i]) return 1; else if(s1.ch[i] < s2.ch[i]) return 2; ++i; } if(s1.length > s2.length) return 1; else if(s1.length < s2.length) return 2; else return 0; }
-
串连接操作
int strconcat(Str *s, Str s1, Str s2){ //将s1 s2 两个串连接并存储在s里面 int i=0,j=0; if(s->ch) {//释放原串空间 free(s->ch); s->ch = NULL; } s->ch = (char *)malloc((s1.length+s2.length+1)*sizeof(char)); if(s->ch == NULL) return ERROR; while(i<s1.length){ s->ch[i] = s1.ch[i]; ++i; } while(j<s2.length+1){ //此处+1将'\0'也赋值过来 s->ch[i+j] = s2.ch[j]; ++j; } s->length = s1.length + s2.length; return OK; }
-
演示代码及结果
int main(int argc, char *argv[]) { Str s1 = {NULL,0},s2 = {NULL,0},s = {NULL,0}; //这里必须两个都要初始化 strassign(&s1,"Hello "); printf("字符串1为:"); printf(s1.ch); printf("\t长:%d \n",s1.length); strassign(&s2,"World!"); printf("字符串2为:"); printf(s2.ch); printf("\t长:%d \n",s2.length); printf("两个字符串比较结果:%d\n",strcompare(s1, s2)); strconcat(&s, s1, s2); printf("两个字符串粘贴后为:"); printf(s.ch); printf("\t长:%d \n",s.length); return 0; }
结果正确!
——————————————————————————————————
这次遇到一个问题,在主函数中如果定义结构体三个s不初始化,只有第一个可以使用,后续的无效,所以必须将三个都初始化。
结构体初始化,都初始化就都有内存空间地址都可以都引用,默认初始化,第一个系统默认给个内存空间,第二个系统还会给吗