标签: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