串的定长顺序存储结构
这种结构如果操作中出现序列长度超过上界MAXSTRSIZE的情况时会导致截尾情况,而一般这在实际使用中不是想得到的。
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
#define MAXSTRSIZE 255 /* 串的最大长度 */
typedef unsigned char SString[MAXSTRSIZE+1];
/* 生成一个其值等于chars的串T */
Status StrAssign(SString T, char chars[])
{
int i;
for(i=0; i < MAXSTRSIZE && chars[i] != ' '; i++)
T[i+1] = chars[i];
T[0] = i;
if(i >= MAXSTRSIZE)
return FALSE; /* 被截断了 */
return TRUE;
}
/* 由串S复制得到串T */
Status StrCopy(SString T, SString S)
{
int i;
for(i=1; i<=S[0]; i++)
T[i] = S[i];
T[0] = i-1;
if(i>MAXSTRSIZE)
return FALSE; /* 截断 */
return TRUE;
}
/* 比较S,T,若S>T返回值>0 ,若S=T,返回0,若S<T,返回值<0 */
int StrCompare(SString S, SString T)
{
int i;
for(i=1; i<=S[0] && i<=T[0] && S[i] == T[i]; i++)
; /* 判断是否完全相等 */
i--;
if( i==T[0] && i==S[0] )
return 0;
else
return S[i+1] - T[i+1];
}
/* 清空字符串 */
Status ClearStr(SString S)
{
for(int i=1; i<=S[0]; i++)
S[i] = 0;
S[0] = 0;
return OK;
}
// Status Index(SString S, SString T, int pos)
// {
// }
/* 打印串 */
Status PrintSString(SString T)
{
for(int i=1; i<=T[0]; i++) /* 从第一个字符到最后一个字符 */
printf("%c",T[i]);
printf("
");
}
/* 返回串的长度 */
int StrLength(SString T)
{
return T[0];
}
/* 从串种获取子串 */
Status SubString(SString Sub, SString S, int pos, int len)
{
if(pos<1 || pos>S[0] || len<0 || len>S[0]-pos+1)
return ERROR;
for(int i=1,j=pos; i<=len; i++,j++)
Sub[i] = S[j];
Sub[0] = len;
}
/* 将两个串连接到一个串上 */
Status Concat(SString T, SString S1, SString S2)
{
int i;
for(i=1; i <= MAXSTRSIZE && i <= S1[0]; i++)
T[i] = S1[i];
T[0] = i-1;
if(i > MAXSTRSIZE)
return FALSE; /* 只储存S1就截断了 */
for(int j=1; i <= MAXSTRSIZE && j<= S2[0]; i++,j++)
T[i] = S2[j];
T[0] = i-1;
if(i > MAXSTRSIZE)
return FALSE; /* 存了第一个,到第二个就截断了 */
return TRUE; /* 没有截断 */
}
int main()
{
SString T,S1,S2;
StrAssign(S1,"Hello World");
StrAssign(S2,"Hello World");
// PrintSString(T);
printf("equ %d
",StrCompare(S1,S2));
// StrCopy(S1,T);
PrintSString(S1);
return 0;
}