資料結構中對字串的操作
阿新 • • 發佈:2018-11-23
不說廢話直接上原始碼
C語言實現
#include <string.h> #include <stdio.h> #include <stdlib.h> #define MAXSTRLEN 255 #define OK 1 #define ERROR -1 typedef int Status; typedef struct{ char str[MAXSTRLEN]; int length; }StringType; Status StrConcat(StringType *s, StringType *t); Status subString(StringType s, int pos, int len); void MyPuts(StringType s); int StrCompare(StringType s, StringType t); void StrLength(StringType s); void ClearStr(StringType *s); int Index(StringType s, StringType t, int pos); int main() { printf("--------選單---------\n"); printf("1,字串長度\n"); printf("2,清空字串\n"); printf("3,兩個字串連線\n"); printf("4,兩個字串比較大小\n"); printf("5,求子串\n"); printf("6,求子串在主串中的位置\n"); StringType s; printf("請輸入字串:"); while(1) { int key; int pos,len; StringType p, q; StringType m, n; StringType a; StringType x, y; int pos1; gets(s.str); s.length = strlen(s.str); printf("請輸入要執行的操作:"); scanf("%d", &key); switch(key) { case 1: StrLength(s); break; case 2: ClearStr(&s); break; case 3: getchar(); printf("請輸入字串:"); gets(p.str); /*字串的長度要存到資料結構中的length中*/ p.length = strlen(p.str); printf("請輸入字串:"); gets(q.str); q.length = strlen(q.str); StrConcat(&p, &q); MyPuts(p); break; case 4: getchar(); printf("請輸入字串:"); gets(m.str); /*字串的長度要存到資料結構中的length中*/ m.length = strlen(m.str); printf("請輸入字串:"); gets(n.str); n.length = strlen(n.str); StrCompare(m,n); break; case 5: getchar(); printf("請輸入字串:"); gets(a.str); /*字串的長度要存到資料結構中的length中*/ a.length = strlen(a.str); printf("請輸入子串開始的位置:"); scanf("%d", &pos); printf("請輸入子串長度:"); scanf("%d", &len); subString(a, pos, len); break; case 6: getchar(); printf("請輸入字串:"); gets(x.str); /*字串的長度要存到資料結構中的length中*/ x.length = strlen(x.str); printf("請輸子串:"); gets(y.str); y.length = strlen(y.str); printf("你想從第幾個位置開始查詢:"); scanf("%d", &pos1); Index(x,y,pos1); break; default: printf("defaul\n"); break; } } return 0; } Status StrConcat(StringType *s, StringType *t) { int i; if((s->length + t->length)>MAXSTRLEN) { printf("連線後長度超出範圍\n"); return ERROR; } for(i=0; i < t->length; i++) { s->str[s->length+i] = t->str[i]; } s->length = s->length + t->length; return OK; } Status subString(StringType s, int pos, int len) { StringType sub; int k, j; if(pos<1||pos>s.length||len<0||len>(s.length-pos+1)) return ERROR; sub.length = len; for(j=0, k=pos-1;k<pos+len-1;k++,j++) sub.str[j] = s.str[k]; printf("子串為:"); for(k = 0; k<sub.length; k++) { printf("%c", sub.str[k]); } printf("\n"); return OK; } void MyPuts(StringType s) { int i; for(i = 0; i < s.length; i++) { putchar(s.str[i]); } } int StrCompare(StringType s, StringType t) { int i; for(i = 0; i<s.length&&i<t.length; i++) { if(s.str[i] != t.str[i]) { printf("兩個字串不相等,Ascll碼值相差:%d\n",s.str[i] - t.str[i] ); return s.str[i] - t.str[i]; } } if(s.length - t.length == 0) { printf("兩個字串相等\n"); return s.length - t.length; } if(s.length - t.length > 0) { printf("兩個字串不相等\n"); return s.length - t.length; } } void StrLength(StringType s) { if(s.length == 0) printf("字串為空\n"); else printf("字串長度為%d\n", s.length); } void ClearStr(StringType *s) { if(s->str) { free(s->str); } s->length = 0; printf("字串以清空\n"); } int Index(StringType s, StringType t, int pos) { int i = pos-1,j=0; while(i <= s.length -1 && j<= t.length -1) { if(s.str[i] == t.str[j]) { i++; j++; } else { i = i-j+1; j=0; } } if(j>=t.length) { printf("匹配成功,子串在主串第 %d 個字元後的位置\n",i-t.length); return i-t.length-1; } else { printf("匹配失敗\n"); return 0; } }