串(string)是由零个或多个字符组成的有限序列,又名叫字符串。 串一般记为。用双引号或单引号括起来的字符序列是串的值(引号不属于串的内容)。所谓的序列,说明串的相邻字符之间具有前驱和后继的关系。 几种特殊的串
空串(nullstring):零个字符的串,它的长度为零,可以直接用两双引号“""”表示,也可以用希腊字母“Φ”来表示。 空格串:只包含空格的串。 子串与主串:串中任意个数的连续字符组成的子序列称为该串的子串,相应地,包含子串的串称为主串。子串在主串中的位置就是子串的第一个字符在主串中的序号。串的比较是通过组成串的字符之间的编码来进行的,而字符的编码指的是字符在对应字符集中的序号。 目前计算机常用的编码方式为标准的ASCII编码,由7位二进制数表示一个字符,总共可以表示128个字符。后来发现一些特殊符号的出现,128个不够用,于是扩展ASCII码由8位二进制数表示一个字符,总共可以表示256个字符,这已经足够满足以英语为主的语言和特殊符号进行输入、存储、输出等操作的字符需要了。 全世界有成百上千种语言与文字,显然这256个字符是不够的,因此后来就有了Unicode编码,比较常用的是由16位的二进制数表示一个字符,这样总共就可以表示个字符,约是6.5万多个字符,足够表示世界上所有语言的所有字符了。为了和ASCII码兼容,Unicode的前256个字符与ASCII码完全相同。串的比较是通过组成串的字符之间的编码来进行的,而字符的编码指的是字符在对应字符集中的序号。 串的基本操作代码如下:
头文件:
#define SIZE 100 typedef struct Str { char elem[SIZE]; int length;//字符串有效长度 }Str; //功能函数 void StrAssign(Str*s, const char *chars);/// void StrCpy(Str*s, Str *t); void show(Str *s); bool Isempty(Str *s);// int GetLength(Str*s); void clear(Str*s); bool SubStr(Str*sub, Str*s, int pos, int len);//从s里面的第pos位置提取长度为len的子串,放到sub中。空白不提取 bool Insert(Str*s, int pos, Str*t);//在pos位置插入t int BF(Str*s, Str*sub, int pos); bool DeletePos(Str*s, int pos, int len);//从pos位置开始删除len长度 bool Delete(Str*s, int pos, Str*t);//从pos位置删子串t bool Replace(Str*s, Str *t, Str*v, int pos);//用v替换从pos位置开始的第一个 bool ReplaceAll(Str *s, Str *t, Str*v); Str.cpp #include<stdio.h> #include<assert.h> #include<string.h> #include"Str.h" void StrAssign(Str *s,const char *chars)//初始化 { assert(s != NULL); int len = strlen(chars); if (len > SIZE) { return; } for (int i = 0; i < len; i++) { s->elem[i] = chars[i]; } s->length = len; } void StrCpy(Str *s, Str*t)//串t 拷贝到s { assert(s!= NULL&& t!=NULL); for (int i = 0; i < t->length; i++) { s->elem[i] = t->elem[i]; } s->length = t->length; } void show(Str *s)//show { for (int i = 0; i < s->length; i++) { printf("%c", s->elem[i]); } printf("\n"); } bool IsEmpty(Str*s)//判空 { return s->length == 0; } int GetLength(Str*s)//串长度 { return s->length; } void Clear(Str*s)//清空 { s->length = 0; } bool SubStr(Str*sub, Str*s, int pos, int len)//从s里面的第pos位置提取长度为len的子串,放到sub中。且空白不提取 { assert(sub != NULL&& s != NULL); if (pos < 0 || len<=0||pos+len>s->length-1|| pos>=s->length) { return false; } for (int i =0; i <= len;i++) { sub->elem[i] = s->elem[i+pos]; } sub->length = len; return true; } bool Insert(Str*s, int pos, Str*t)//在pos位置插入字符串t { assert(s != NULL&& t != NULL); int lens = GetLength(s); int lent = GetLength(t); if (pos < 0||lens+lent>SIZE||pos>=s->length) { return false; } for (int i =lens-1; i > pos ; --i)//挪数据 { s->elem[i + lent] = s->elem[i]; } for (int i = 0; i < lent; i++) { s->elem[pos + i] = t->elem[i]; } s->length += t->length; } int BF(Str*s, Str*sub, int pos)// { if (pos<0 || pos>s->length) { return -1; } int i = pos; int j = 0; int lens = GetLength(s); int lensub = GetLength(sub); while (i < lens&&j < lensub) { if (s->elem[i] == sub->elem[j]) { i++; j++; } else { i = i - j + 1; j = 0; } } if (j >= lensub) { return i - j; } else { return -1; } } bool DeletePos(Str*s, int pos, int len)//从pos位置开始删除len长度 { assert(s != NULL); if (pos <0 || len > s->length || pos+len>s->length||len<0) { return false; } for (int i = pos; i < s->length - len; i++) { s->elem[i] = s->elem[i+len]; } s->length -= len; return true; } bool Delete(Str*s, int pos, Str*t)//从pos位置删子串t { int index = BF(s, t, pos);//找子串 if (index < 0) { return false; } return DeletePos(s, index, t->length); } bool Replace(Str*s, Str *t, Str*v, int pos)//用v替换从pos位置开始的第一个 { assert(s != NULL || t != NULL || v != NULL); int index = BF(s, t, pos); if (index < 0) { return false; } DeletePos(s, index, t->length); return Insert(s, index, v); } bool ReplaceAll(Str *s, Str *t, Str*v)//全替换 { while (Replace(s, t, v, 0)); return true; } 测试用例: test.cpp #include<stdio.h> #include<string.h> #include"Str.h" int main() { Str s; char *s1 = "iloveyouandyouloveme"; StrAssign(&s,s1); show(&s); int len1 = GetLength(&s); printf("字符串1长度:%d\n", len1); Str t; char *s2 = "love"; StrAssign(&t,s2); show(&t); int len2 = GetLength(&t); printf("字符串2长度:%d\n", len2); /*Str s3; SubStr(&s3, &s, 2, 5); show(&s3); Insert(&s,3, &t); show(&s); //StrCpy(&s, &t); //show(&s); int bf = BF(&s, &t, 5); printf("bf:%d\n", bf); DeletePos(&s, 5, 10); show(&s); Delete(&s, 5, &t); show(&s);*/ Str s3; char *p = "oooo"; StrAssign(&s3, p); show(&s3); Replace(&s, &t, &s3, 5); printf("替换为:"); show(&s); ReplaceAll(&s, &t, &s3); printf("全替换为:"); show(&s); return 0; } 运行结果: