串(或字符串),是由零个或多个字符组成的有穷序列。含零个字符的串称为空串,用Ф表示。
串中所含字符的个数称为该串的长度(或串长)。
通常将一个串表示成"a1a2…an"的形式。其中,最外边的双引号本身不是串的内容,它们是串的标志,以便将串与标识符(如变量名等)加以区别。每个ai(1≤i≤n)代表一个字符。
//字符串
#include "stdafx.h"
#include <stdio.h>
#define MaxSize 100 //最多的字符个数
typedef struct
{
char data[MaxSize];//可容纳MaxSize个字符的空间
int length;//当前串的实际长度
}SqString;
//将一个字符串常量赋给串s,即生成一个其值等于cstr[]的串s。
void StrAssign(SqString &s, char cstr[])
{
int i;
for (i = 0; cstr[i] != '\0' && i < MaxSize; i++)
{
s.data[i] = cstr[i];
}
s.length = i;
}
//串复制:将串t赋给串s。
void StrCopy(SqString &s, const SqString t)
{
int i;
for (i = 0; i < t.length && i < MaxSize; i++)
{
s.data[i] = t.data[i];
}
s.length = t.length;
}
//判串相等:若两个串s与t相等则返回真;否则返回假。
bool StrEqual(const SqString s, const SqString t)
{
bool same = true;
int i;
if (s.length != t.length)
{
same = false;//长度不等则串不等
}else
{
for (i = 0; i < s.length ; i++)
{
if (s.data[i] != t.data[i])
{
same = false;
break;
}
}
}
return same;
}
//求串长:返回串s中字符个数。
int StrLength(const SqString s)
{
return s.length;
}
//返回由两个串s和t连接在一起形成的新串。
SqString Concat(SqString s, SqString t)
{
SqString str;
int i;
str.length = s.length + t.length;
for (i = 0; i < s.length; i++)
{//将s.data[0..s.length-1]复制到str
str.data[i] = s.data[i];
}
for (i = 0; i < t.length; i++)
{//将t.data[0..t.length-1]复制到str
str.data[s.length + i] = t.data[i];
}
return str;
}
//返回串s中从第i(1≤i≤StrLength(s))个字符开始的、由连续j个字符组成的子串。
SqString SubStr(SqString s,int i, int j)
{
int k;
SqString str;
str.length = 0;
if (i <= 0 || i > s.length || j < 0 || i + j - 1 > s.length)
{
return str;//参数不正确,返回空串
}
for (k = i - 1; k < i + j - 1; k++)
{//将s.data[i..i+j]复制到str
str.data[k - i + 1] = s.data[k];
}
str.length = j;
return str;
}
//将串s2插入到串s1的第i个字符中,即将s2的第一个字符作为s1的第i个字符,并返回产生的新串。
SqString InsStr(SqString s1, int i, SqString s2)
{
int j;
SqString str;
str.length = 0;
if (i <= 0 || i > s1.length + 1)
{
return str;//参数不正确时返回空串
}
for (j = 0; j < i -1; j++)
{//将s1.data[0..i-2]复制到str
str.data[j] = s1.data[j];
}
for (j = 0; j < s2.length; j++)
{//将s2.data[0..s2.length-1]复制到str
str.data[i + j - 1] = s2.data[j];
}
for (j = i -1; j < s1.length; j++)
{//将s1.data[i-1..s1.length-1]复制到str
str.data[s2.length + j] = s1.data[j];
}
str.length = s1.length + s2.length;
return str;
}
// 从串s中删去第i(1≤i≤StrLength(s))个字符开始的长度为j的子串,并返回产生的新串。
SqString DelStr(SqString s,int i, int j)
{
int k;
SqString str;
str.length = 0;
if (i <= 0 || i > s.length || i + j > s.length + 1)
{
return str;//参数不正确,返回空串
}
for (k = 0; k < i - 1; k++)
{//将s.data[0..i-2]复制到str
str.data[k] = s.data[k];
}
for (k = i + j -1; k < s.length; k++)
{//将s.data[i+j-1..s.length-1]复制到str
str.data[k - j] = s.data[k];
}
str.length = s.length - j;
return str;
}
// 在串s中,将第i(1≤i≤StrLength(s))个字符开始的j个字符构成的子串用串t替换,并返回产生的新串。
SqString RepStr(SqString s, int i, int j, SqString t)
{
int k;
SqString str;
str.length = 0;
if (i <= 0 || i > s.length || i + j - 1 > s.length)
{
return str;//参数不正确,返回空串
}
for (k = 0; k < i - 1; k++)
{//将s.data[0..i-2]复制到str
str.data[k] = s.data[k];
}
for (k = 0; k < t.length; k++)
{//将t.data[0..t.length-1]复制到str
str.data[i + k -1] = t.data[k];
}
for (k = j + i -1; k < s.length; k++)
{//将s.data[i+j-1..s.length-1]复制到str
str.data[t.length + k - j] = s.data[k];
}
str.length = s.length - j + t.length;
return str;
}
//输出串s的所有元素值。
void DispStr(SqString s)
{
int i;
if (s.length > 0)
{
for (i = 0; i < s.length; i++)
{
printf("%c", s.data[i]);
}
printf("\n");
}
}
int main()
{
SqString s,s1,s2,s3,s4,s5;
printf("顺序串的基本运算如下:\n");
printf(" (1)建立串s和串s1\n");
StrAssign(s,"abcdefghijklmn");
StrAssign(s1,"123");
printf(" (2)输出串s:");
DispStr(s);
printf(" (3)串s的长度:%d\n",StrLength(s));
printf(" (4)在串s的第9个字符位置插入串s1而产生串s2\n");
s2 = InsStr(s,9,s1);
printf(" (5)输出串s2:");
DispStr(s2);
printf(" (6)删除串s第2个字符开始的5个字符而产生串s2\n");
s2 = DelStr(s,2,3);
printf(" (7)输出串s2:");
DispStr(s2);
printf(" (8)将串s第2个字符开始的5个字符替换成串s1而产生串s2\n");
s2 = RepStr(s,2,5,s1);
printf(" (9)输出串s2:");
DispStr(s2);
printf(" (10)提取串s的第2个字符开始的10个字符而产生串s3\n");
s3 = SubStr(s,2,10);
printf(" (11)输出串s3:");
DispStr(s3);
printf(" (12)将串s1和串s2连接起来而产生串s4\n");
s4 = Concat(s1,s2);
printf(" (13)输出串s4:");
DispStr(s4);
printf(" (14)s4复制字符串到s5\n");
StrCopy(s5, s4);
printf(" (15)输出串s5:");
DispStr(s5);
printf(" (16)比较s4和s5是否相等\n");
printf(" (17)s4和s5%s\n", StrEqual(s4, s5) ? "相等":"不想等");
return 0;
}