str.c
来自「压缩包里面的都是精致的基本C语言小程序」· C语言 代码 · 共 189 行
C
189 行
#include <stdio.h>#include <string.h>#include "mystdlib.h"#include "error.h"#include "commonInter.h"#include "str.h"struct str{ tyVft vft; char *str; int size;};struct tyVft strVft;static int flag = 1;static char *clone (char *s);static char *clone2 (char *s, int size);str newStr (char *s){ int sizeOfs = strlen (s); str ss = (str)checkedMalloc (sizeof (*ss)); ss->vft = &strVft; if (sizeOfs) ss->str = clone (s); else ss->str = NULL; ss->size = sizeOfs; if (flag) { flag--; strVft.equals = strEquals; strVft.hashCode = strHashCode; strVft.toString = strToString; strVft.getPlist = strGetPlist; } return ss;}str newStr2 (char *s, int size){ str ss = (str)checkedMalloc (sizeof (*ss)); if (!size) ss->str = clone2 (s, size); else ss->str = NULL; ss->vft = &strVft; ss->size = size; return ss;}static char *clone (char *s){ char *temp = (char*)checkedMalloc ((strlen (s)) * sizeof(char)); int i = 0; for (; s[i]; i++) temp[i] = s[i]; return temp;}static char *clone2 (char *s, int size){ char *temp = (char*)checkedMalloc (size * sizeof(char)); for (int i = 0; i<size; i++) temp[i] = s[i]; return temp;}char *strToCharStar (str s){ char *temp = checkedMalloc ((s->size+1) * sizeof (char)); for (int i=0; i<s->size; i++) temp[i] = (s->str)[i]; temp [s->size] = '\0'; return temp;}str strClone (str s){ str ss = checkedMalloc (sizeof (*ss)); ss->vft = &strVft; ss->str = clone2 (s->str, s->size); ss->size = s->size; return ss;}str strConcat (str s1, str s2){ char *temp = (char*)checkedMalloc ((s1->size + s2->size) * sizeof(char)); int i = 0; for (; i<s1->size; i++) temp[i] = (s1->str)[i]; int j = 0; for (; j<s2->size; j++) temp[i+j] = (s2->str)[j]; str str = checkedMalloc (sizeof (*str)); str->vft = &strVft; str->str = temp; str->size = s1->size + s2->size; return str;}int strSize (str s){ return s->size;}void strOutput (poly s){ fwrite (((str)s)->str, sizeof(char), ((str)s)->size, stdout); return;}void strOutput2 (char *s){ printf (s); return;}int strValid (char *s, int max){ for (int i=0; i<max; i++) if (! s[i]) return 1; return 0;}void strFree (str s){ checkedFree (s->str); checkedFree (s); return;}int strHashCode (poly s){ // a trivial but correct one return 0;}str strToString (poly s){ return (str)s;}plist strGetPlist (poly s){ exception ("not implemented yet\n"); return NULL;}int strEquals (poly s1, poly s2){ if (((str)s1)->size != ((str)s2)->size) return 0; for (int i=0; i<((str)s1)->size; i++) { char c1 = (((str)s1)->str)[i]; char c2 = (((str)s2)->str)[i]; if (c1 != c2) return 0; } return 1;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?