데이터 구조 - 문자열 - 전체 실행 가능 코드

7020 단어
#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("
"); } /* S , TRUE, FALSE */ Status StrEmpty(String S) { if(S[0]==0) return TRUE; else return FALSE; } /* 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; } /* T S pos 。 , 0。 */ /* ,T ,1≤pos≤StrLength(S)。 */ int Index(String S, String T, int pos) { int i = pos; /* i S , pos 1, pos */ int j = 1; /* j T */ while (i <= S[0] && j <= T[0]) /* i S j T , */ { if (S[i] == T[j]) /* */ { ++i; ++j; } else /* */ { i = i-j+2; /* i */ j = 1; /* j T */ } } if (j > T[0]) return i-T[0]; else return 0; } /* : S T ,1≤pos≤StrLength(S)+1 */ /* : S pos T。 TRUE, FALSE */ Status StrInsert(String S,int pos,String T) { int i; if(pos< 1||pos>S[0]+1) return ERROR; if(S[0]+T[0]<=MAXSIZE) { /* */ for(i=S[0];i>=pos;i--) S[i+T[0]]=S[i]; for(i=pos;i < pos+T[0];i++) S[i]=T[i-pos+1]; S[0]=S[0]+T[0]; return TRUE; } else { /* */ for(i=MAXSIZE;i<=pos;i--) S[i]=S[i-T[0]]; for(i=pos;i < pos+T[0];i++) S[i]=T[i-pos+1]; S[0]=MAXSIZE; return FALSE; } } /* : S ,1≤pos≤StrLength(S)-len+1 */ /* : S pos len */ Status StrDelete(String S,int pos,int len) { int i; if(pos < 1||pos>S[0]-len+1||len < 0) return ERROR; for(i=pos+len;i<=S[0];i++) S[i-len]=S[i]; S[0]-=len; return OK; } /* : S,T V ,T ( ) */ /* : V S T */ Status Replace(String S,String T,String V) { int i=1; /* S T */ if(StrEmpty(T)) /* T */ return ERROR; do { i=Index(S,T,i); /* i i T */ if(i) /* S T */ { StrDelete(S,i,StrLength(T)); /* T */ StrInsert(S,i,V); /* T V */ i+=StrLength(V); /* V T */ } }while(i); return OK; } int main() { int i, j, opp, pos; char s, str; String t,s1,s2,sub; Status k; printf("
1.StrAssign
2.StrLength
3.StrCompare "); printf("
4.Concat
5.SubString
6.Index "); printf("
7.StrInsert
8.StrDelete
9.Replace "); printf("
0.

"); while(opp != '0') { scanf("%d",&opp); switch(opp) { case 1: k=StrAssign(s1,"nowamagic.net"); if(!k) { printf(" MAXSIZE(=%d)
",MAXSIZE); exit(0); } printf(" s1 :"); StrPrint(s1); printf("
"); break; case 2: printf(" s1 %d
",StrLength(s1)); break; case 3: k=StrAssign(s2,"google.com"); if(!k) { printf(" MAXSIZE(%d)
",MAXSIZE); exit(0); } printf(" s2 :"); StrPrint(s2); printf("
"); i=StrCompare(s1,s2); if(i < 0) s=' < '; else if(i==0) s='='; else s='>'; printf(" s1%c s2
",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
", i, j); k=SubString(sub,s1,i,j); if(k) { printf(" sub : "); StrPrint(sub); } break; case 6: printf(" s1 : "); StrPrint(s1); k=StrAssign(sub,"magic"); printf(" sub : "); StrPrint(sub); i=Index(s1,sub,1); printf("s1 %d sub
",i); break; case 7: printf(" s1 : "); StrPrint(s1); k=StrAssign(sub,"lol"); printf(" sub : "); StrPrint(sub); printf(" : "); scanf("%d", &pos); StrInsert(s1,pos,sub); StrPrint(s1); break; case 8: printf(" s1 pos , len , pos:
"); scanf("%d", &i); printf(" len:
"); scanf("%d", &j); StrDelete(s1,i,j); StrPrint(s1); break; case 9: printf(" s1 : "); StrPrint(s1); StrAssign(t,"a"); printf(" t :"); StrPrint(t); StrAssign(sub,"aa"); printf(" sub :"); StrPrint(sub); printf(" s2 s1 t , s1 : "); Replace(s1,t,sub); StrPrint(s1); break; case 0: exit(0); } } }

공부 하 는 길에 당신 과 함께 격려 합 니 다.

좋은 웹페이지 즐겨찾기