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 + -
显示快捷键?