标签:http io os ar for div sp 问题 代码
/* 生成一个其值等于chars的串T */ 雅加达娱乐城Status StrAssign(String T,char *chars) { int i; if(strlen(chars)>MAXSIZE) return ERROR; else { T[0]=strlen(chars); for(i=1;i<=T[0];i++) T[i]=*(chars+i-1); return OK; } }
/* 初始条件: 串S和T存在 */
/* 操作结果: 若S>T,则返回值>0;若S=T,则返回值=0;若S < T,则返回值 < 0 */
int StrCompare(String S,String T)
{
int i;
for(i=1; i<=S[0]&&i<=T[0]; ++i)
if(S[i]!=T[i])
return S[i]-T[i];
return S[0]-T[0];
}
/* 返回串的元素个数 */
int StrLength(String S)
{
return S[0];
}
/* 用T返回S1和S2联接而成的新串。若未截断,则返回TRUE,否则FALSE */
Status Concat(String T,String S1,String S2)
{
int i;
if(S1[0]+S2[0]<=MAXSIZE)
{ /* 未截断 */
for(i=1;i<=S1[0];i++)
T[i]=S1[i];
for(i=1;i<=S2[0];i++)
T[S1[0]+i]=S2[i];
T[0]=S1[0]+S2[0];
return TRUE;
}
else
{ /* 截断S2 */
for(i=1;i<=S1[0];i++)
T[i]=S1[i];
for(i=1;i<=MAXSIZE-S1[0];i++)
T[S1[0]+i]=S2[i];
T[0]=MAXSIZE;
return FALSE;
}
}
连接两个串,需要考虑截断问题,判断条件就是 S1[0]+S2[0] 是否大于 MAXSIZE。
如果未发生截断,则将数组S2的元素补到S1的后边 T[S1[0]+i]=S2[i];
如果发生截断,那就将MAXSIZE-S1[0]个S2的元素补到S1的后边。
/* 用Sub返回串S的第pos个字符起长度为len的子串。 */
Status SubString(String Sub,String S,int pos,int len)
{
int i;
if(pos<1||pos>S[0]||len<0||len>S[0]-pos+1)
return ERROR;
for(i=1;i<=len;i++)
Sub[i]=S[pos+i-1];
Sub[0]=len;
return OK;
}
完整的可执行程序为:
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 40 /* 存储空间初始分配量 */
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef char String[MAXSIZE+1]; /* 0号单元存放串的长度 */
/* 输出字符串T */
void StrPrint(String T)
{
int i;
for(i=1;i<=T[0];i++)
printf("%c",T[i]);
printf("\n");
}
/* 生成一个其值等于chars的串T */
Status StrAssign(String T,char *chars)
{
int i;
if(strlen(chars)>MAXSIZE)
return ERROR;
else
{
T[0]=strlen(chars);
for(i=1;i<=T[0];i++)
T[i]=*(chars+i-1);
return OK;
}
}
/* 返回串的元素个数 */
int StrLength(String S)
{
return S[0];
}
/* 初始条件: 串S和T存在 */
/* 操作结果: 若S>T,则返回值>0;若S=T,则返回值=0;若S < T,则返回值< 0 */
int StrCompare(String S,String T)
{
int i;
for(i=1;i < =S[0]&&i<=T[0];++i)
if(S[i]!=T[i])
return S[i]-T[i];
return S[0]-T[0];
}
/* 用T返回S1和S2联接而成的新串。若未截断,则返回TRUE,否则FALSE */
Status Concat(String T,String S1,String S2)
{
int i;
if(S1[0]+S2[0]<=MAXSIZE)
{ /* 未截断 */
for(i=1;i<=S1[0];i++)
T[i]=S1[i];
for(i=1;i<=S2[0];i++)
T[S1[0]+i]=S2[i];
T[0]=S1[0]+S2[0];
return TRUE;
}
else
{ /* 截断S2 */
for(i=1;i<=S1[0];i++)
T[i]=S1[i];
for(i=1;i<=MAXSIZE-S1[0];i++)
T[S1[0]+i]=S2[i];
T[0]=MAXSIZE;
return FALSE;
}
}
/* 用Sub返回串S的第pos个字符起长度为len的子串。 */
Status SubString(String Sub,String S,int pos,int len)
{
int i;
if(pos < 1||pos>S[0]||len < 0||len>S[0]-pos+1)
return ERROR;
for(i=1;i<=len;i++)
Sub[i]=S[pos+i-1];
Sub[0]=len;
return OK;
}
int main()
{
int i, j, opp;
char s;
String t,s1,s2,sub;
Status k;
printf("\n1.StrAssign 生成串 \n2.StrLength 求串长 \n3.StrCompare 串比较 ");
printf("\n4.Concat 串连接 \n5.SubString 求子串");
printf("\n0.退出 \n请选择你的操作:\n");
while(opp != ‘0‘)
{
scanf("%d",&opp);
switch(opp)
{
case 1:
k=StrAssign(s1,"nowamagic.net");
if(!k)
{
printf("串长超过MAXSIZE(=%d)\n",MAXSIZE);
exit(0);
}
printf("串s1为:");
StrPrint(s1);
printf("\n");
break;
case 2:
printf("串s1长为%d \n",StrLength(s1));
break;
case 3:
k=StrAssign(s2,"google.com");
if(!k)
{
printf("串长超过MAXSIZE(%d)\n",MAXSIZE);
exit(0);
}
printf("串s2为:");
StrPrint(s2);
printf("\n");
i=StrCompare(s1,s2);
if(i < 0)
s=‘ < ‘;
else if(i==0)
s=‘=‘;
else
s=‘>‘;
printf("串s1%c串s2\n",s);
break;
case 4:
Concat(t,s1,s2);
StrPrint(t);
break;
case 5:
printf("求串s1的子串,请输入子串的起始位置: ");
scanf("%d", &i);
printf("请输入子串的长度: ");
scanf("%d", &j);
printf("起始位置:%d,子串长度:%d\n", i, j);
k=SubString(sub,s1,i,j);
if(k)
{
printf("子串sub为: ");
StrPrint(sub);
}
break;
case 0:
exit(0);
}
}
}
标签:http io os ar for div sp 问题 代码
原文地址:http://www.cnblogs.com/laoyangman/p/3981428.html