串的定义
由 0 个或多个 字符 组成的 有限的 序列,通常记为:s =“a1 a2 a3 … ai …an” ( n≥0 ,且n是有限的)。其中的引号不属于串,只是一个标记作用!
n就是串的长度,且字符串里的字符 ai 的值由 字母、数字或其他字符 组成的。
串的相关术语
- 空串:不含任何字符的串,长度 = 0,用符号 f 表示。也就是说空串也是字符串!
- 空格串:仅由一个或多个空格组成的串。 区分空串和空格串!
- 子串:由串中任意个连续的字符组成的子序列。空串是任意串的子串,任意串是其自身的子串。
- 主串:包含子串的串。
- 字符的位置:字符在序列中的序号。
- 子串在主串中的位置:子串的首字符在主串中的位置。
- 串相等:当两个串的长度相等且各个对应位置的字符都相等时才相等。
串的基本操作
- 串的创建
- 输出串长
- 进行两个串的比较(如果是包含关系则比较串长,否则比较ASCALL码的值)
- 清空串
- 两个串的连接
- 求出某个串指定位置的子串
- 求出子串在指定串的位置
串的创建
//创建一个结构体变量 通过字符串去创建
LPSTR createstring(const char* str)
{
LPSTR pstr = (LPSTR)malloc(sizeof(string)); //做动态内存申请
assert(pstr);
for (int i = 0; i < MAX; i++) //给属性做初始化 memset
{
pstr->mem[i] = '\0'; //给pstr的数组做初始化
}
int count = 0;
while (str[count] != '\0') //!='\0' 把字符串中东西拷贝进去
{
pstr->mem[count] = str[count]; //没有把'\0'拷贝进去 strcpy
count++;
}
pstr->curSize = count;
return pstr;
}
串的插入
//串的插入 当前的串 要插入的串 字符串的长度 指定下标
void insertstring(LPSTR pstr, const char* str, int len, int pos)
{
if (pos < 0 || pos >= MAX) //下标是否满足规则
{
printf("无效下标!\n");
return;
}
if (pstr->curSize + len >= MAX) //满的状态
{
printf("太长,无法插入!\n");
return;
}
if (pos > pstr->curSize) //下标大于curSize
{
for (int i = 0; i < len; i++) //把新字符串放在原字符串后面
{
pstr->mem[pstr->curSize++] = str[i];
}
}
else //下标刚好在字符串里面
{
//1.腾位置
for (int i = pstr->curSize; i >= pos; i--) //从后面开始挪
{
pstr->mem[len + i] = pstr->mem[i]; //把i的元素挪到 i+len 的位置
}
//2.插入新的字符串
for (int i = 0; i < len; i++)
{
pstr->mem[pos + i] = str[i]; //从 pos+i 的位置开始放入需要插入的字符串
}
pstr->curSize += len; //原字符串的长度需要改变
}
}
//测试代码
LPSTR str1 = createstring("string"); //创建串
insertstring(str1, "Love", 4, 3); //插入串
printstring(str1); //strLoveing
insertstring(str1, "Miss", 4, 13); //strLoveingMiss
printstring(str1);
打印串
//要打印的串
void printstring(LPSTR pstr)
{
for (int i = 0; i < pstr->curSize; i++)
{
putchar(pstr->mem[i]); //用putchar的方式做打印
}
putchar('\n');
}
串的删除
//要删除的串 删除开始位置 第n个元素 删除的结束位置-->删除这段区间中的元素
void deletestring(LPSTR pstr, int start, int end)
{
if (start > end || end > pstr->curSize || start <= 0) //下标是否满足要求
{
printf("区间有误!\n");
return;
}
int count = end - start + 1; //移动的位置
for (int i = end, j = start - 1; i < pstr->curSize; i++, j++)
{
pstr->mem[j] = pstr->mem[i]; //注意没有把后面的串置为'\0'
}
//伪删除,手动置0
for (int i = pstr->curSize; i >= pstr->curSize - count; i--)
{
pstr->mem[i] = '\0';
}
pstr->curSize -= count; //注意长度变化
}
//测试代码 strLoveingMiss
deletestring(str1, 4, 7); //删除第4个-第7个位置
printstring(str1); //stringMiss