“串”学习——三种表示方法
串有三种表示方法:
str.h
#ifndef _STR_H #define _STR_H #define MAXSTRING 255 typedef unsigned char STR[MAXSTRING+1]; void NewStr(STR &s,char *str); void ClearStr(STR &s); int StrCompare(STR s,STR t); int StrConcat(STR &s,STR t); int SubStr(STR &s,STR t,int pos,int len); #endif
str.cpp
#include<stdio.h> #include<stdlib.h> #include"str.h" void NewStr(STR &s,char *str) { int i; if(str == NULL) return; for(i=0; str[i]; i++) s[i] = str[i]; s[i] = 0; } void ClearStr(STR &s) { s[0] = 0; } int StrCompare(STR s,STR t) { int i; for(i=0; s[i] && t[i] ;i++) if(s[i] != t[i]) return s[i] - t[i]; if(s[i]) return 1; else if(t[i]) return -1; else return 0; } int StrConcat(STR &s,STR t) { int i,j; for(i=0; s[i] ;i++); for(j=0; t[j] && i<= MAXSTRING ;i++,j++) s[i] = t[j]; if(i>MAXSTRING && t[j]) { ClearStr(s); return 0; } s[i] = 0; } int SubStr(STR &s,STR t,int pos,int len) { int i,j; for(i=0; i<pos -1; i++) if(!t[i]) return 0; for(j=0; j<len && t[i] ;i++,j++) s[j] = t[i]; if(j!=len) { ClearStr(s); return 0; }else{ s[j] = 0; return 1; } }
testString.cpp
#include<stdio.h> #include "str.h" void main() { int res; STR t,s; NewStr(s,"hello"); printf("s=%s\n",s); NewStr(t,"hello"); res = StrCompare(s,t); if(res == 0) printf("s==t\n"); else if(res > 0) printf("s > t\n"); else printf("s < t\n"); NewStr(t," world"); StrConcat(s,t); printf("s=%s\n",s); ClearStr(t); SubStr(t,s,2,6); printf("t=%s\n",t); ClearStr(s); }
str.h
#ifndef _STR_H #define _STR_H typedef struct { char *ch; int len; }STR; STR *NewStr(char *str); void DestroyStr(STR *s); void ClearStr(STR *s); int StrCompare(STR *s,STR *t); int StrConcat(STR *s,STR *t); STR * SubStr(STR *s,int pos,int len); #endif
str.c
#include<stdio.h> #include<stdlib.h> #include"str.h" //根据char[]创建字符串 STR *NewStr(char *str) { STR * s = NULL; int i; s = (STR *)malloc(sizeof(STR)); if(s == NULL) return NULL; //循环到str[i]==\0时结束,i就是字符串的长度 for(i = 0; str[i] ; ++i); s->ch = (char *)malloc((i + 1) * sizeof(char)); if(s->ch == NULL) { free(s); return NULL; } //将str中内容搬到s.ch里 s->len = i; while(i>=0) { s->ch[i] = str[i]; --i; } return s; } void DestroyStr(STR *s) { free(s->ch); free(s); } void ClearStr(STR *s) { free(s->ch); s->ch = NULL; s->len = 0; } int StrCompare(STR *s,STR *t) { int i; for(i = 0; i < s->len && i < t->len;i++)//abc abcde //s->ch[i]ASCII码大则返回正数代表大于关系 //如果s->ch[i]比较小,则返回负数代表小于关系 if(s->ch[i] != t->ch[i]) return s->ch[i] - t->ch[i]; //s比t短时返回负数,比t长时返回正,一样长返回0 return s->len - t->len; } int StrConcat(STR *s,STR *t) { //s,t都指向一块内存区,而他们合并后的内存区一定比他们大 char *temp = NULL; int i; temp = (char *)malloc((s->len + t->len +1) * sizeof(char)); if(temp == NULL) return 0; for(i = 0;i < s->len ;i++) temp[i] = s->ch[i]; for(; i < s->len + t->len ;i++) temp[i] = t->ch[i - s->len]; temp[i] = 0; ClearStr(s); s->ch = temp; s->len = i; return 1; } STR * SubStr(STR *s,int pos,int len) { STR * t = NULL; if(pos < 1 || pos > s->len || len < 0 || len > s->len - pos) return NULL; t = NewStr(""); ClearStr(t); t->ch = (char *)malloc((len + 1) * sizeof(char)); if(t->ch == NULL) return NULL; t->len = len; //把有效的len位字符搬到t里面去 for(--len ;len >= 0;-- len) t->ch[len] = s->ch[pos - 1 + len]; t->ch[t->len] = 0; return t; }
testString.c
#include<stdio.h> #include "str.h" void main() { int res; STR *t = NULL,*s = NewStr("hello"); printf("s=%s,len=%d\n",s->ch,s->len); t = NewStr("hello"); res = StrCompare(s,t); if(res == 0) printf("s==t\n"); else if(res > 0) printf("s > t\n"); else printf("s < t\n"); t = NewStr(" world"); StrConcat(s,t); printf("s=%s,len=%d\n",s->ch,s->len); DestroyStr(t); t = SubStr(s,2,5); printf("t=%s,len=%d\n",t->ch,t->len); DestroyStr(s); }
str.h
#ifndef _STR_H #define _STR_H #define CHUNKSIZE 4 typedef struct Chunk { char ch[CHUNKSIZE]; struct Chunk *next; }CHUNK; typedef struct { CHUNK *head,*tail; int curlen; }STR; STR *NewStr(char *str); void DestroyStr(STR *s); void ClearStr(STR *s); int StrCompare(STR *s,STR *t); int StrConcat(STR *s,STR *t); STR * SubStr(STR *s,int pos,int len); void PrintStr(STR *s); #endif
str.c
#include<stdio.h> #include<stdlib.h> #include"str.h" //根据char[]创建字符串 STR *NewStr(char *str) { int i,j; CHUNK *temp; STR *s = (STR *)malloc(sizeof(STR)); s->head = (CHUNK *)malloc(sizeof(CHUNK)); s->tail = s->head; s->tail->next = NULL; s->curlen = 1; for(i=0,j=0; str[i] ;i++,j++){ if(j == CHUNKSIZE){ temp = (CHUNK *)malloc(sizeof(CHUNK)); temp->next = NULL; s->tail->next = temp; s->tail = temp; s->curlen ++; j=0; } s->tail->ch[j] = str[i]; } if(j == CHUNKSIZE)//有用的字符占满了最后一块空间 { temp = (CHUNK *)malloc(sizeof(CHUNK)); temp->next = NULL; s->tail->next = temp; s->tail = temp; s->curlen ++; j=0; } //填掉空白部分 for(;j<CHUNKSIZE;j++) s->tail->ch[j] = 0; return s; } void DestroyStr(STR *s) { CHUNK * temp = s->head; while(temp) { s->head = s->head->next; free(temp); temp = s->head; } free(s); } void ClearStr(STR *s) { for(;s->head;s->head = s->head->next) free(s->head); s->head = s->tail = NULL; s->curlen = 0; } int StrCompare(STR *s,STR *t) { int i; CHUNK *s1 = s->head,*t1 = t->head; for(i = 0; s1 && t1 ;i++) { if(s1->ch[i] != t1->ch[i]) return s1->ch[i] - t1->ch[i]; if(i == CHUNKSIZE-1) { s1 = s1->next; t1 = t1->next; i = -1; } } if(s1) return 1; else if(t1) return -1; else return 0; } int StrConcat(STR *s,STR *t) { CHUNK * temp,*s1 = s->tail,*t1 = t->head; int i,j; for(i=0;s1->ch[i];i++); for(j=0;;i++,j++) { if(i == CHUNKSIZE){ temp = (CHUNK *)malloc(sizeof(CHUNK)); temp->next = NULL; s1->next = temp; s1 = temp; s->curlen ++; i=0; } if(j == CHUNKSIZE){ t1 = t1->next; j=0; } if(t1->ch[j]) s1->ch[i] = t1->ch[j]; else break; } if(i == CHUNKSIZE)//有用的字符占满了最后一块空间 { temp = (CHUNK *)malloc(sizeof(CHUNK)); temp->next = NULL; s1->next = temp; s1 = temp; s->curlen ++; i=0; } //填掉空白部分 for(;i<CHUNKSIZE;i++) s1->ch[i] = 0; return 1; } STR * SubStr(STR *s,int pos,int len) { int i,j,k; CHUNK * s1 = s->head,*temp; STR * t = (STR *)malloc(sizeof(STR)); t->head = (CHUNK *)malloc(sizeof(CHUNK)); t->tail = t->head; t->tail->next = NULL; t->curlen = 1; for(i=0,j=0; s1 && i < pos - 1;i++,j++) { if(j == CHUNKSIZE - 1) { s1 = s1->next; j = -1; } } if(!s1)return 0; for(k = 0; s1 && i<pos - 1 + len ;i++,j++,k++) { if(k == CHUNKSIZE){ temp = (CHUNK *)malloc(sizeof(CHUNK)); temp->next = NULL; t->tail->next = temp; t->tail = temp; t->curlen ++; k=0; } t->tail->ch[k] = s1->ch[j]; if(j == CHUNKSIZE - 1) { s1 = s1->next; j = -1; } } if(k == CHUNKSIZE)//有用的字符占满了最后一块空间 { temp = (CHUNK *)malloc(sizeof(CHUNK)); temp->next = NULL; t->tail->next = temp; t->tail = temp; t->curlen ++; k=0; } //填掉空白部分 for(;k<CHUNKSIZE;k++) t->tail->ch[k] = 0; return t; } void PrintStr(STR *s) { int i; CHUNK * temp = s->head; for(i=0; temp ;i++) { if(temp->ch[i]) printf("%c",temp->ch[i]); else break; if(i == CHUNKSIZE - 1) { temp = temp->next; i = -1; } } printf("\n"); }
testString.c
#include<stdio.h> #include "str.h" void main() { int res; STR *t = NULL,*s = NewStr("hello"); PrintStr(s); t = NewStr("hello"); res = StrCompare(s,t); if(res == 0) printf("s==t\n"); else if(res > 0) printf("s > t\n"); else printf("s < t\n"); t = NewStr(" world"); StrConcat(s,t); PrintStr(s); DestroyStr(t); t = SubStr(s,2,6); PrintStr(t); DestroyStr(s); }