C语言数据结构之顺序结构,字符串(String)的计算HASHCODE的方法和其他功能

C语言数据结构之顺序结构,字符串(String)的计算HASHCODE的方法和其他功能

继续上一个关于String的操作

判断字符串是否以prefix开头/是否以suffix结尾

  • 是否以suffix结尾函数 string_ends_with
  • 是否以prefix开头函数 string_starts_with

代码如下:

/* if string ends with suffix return 1 else return 0 */
int
string_ends_with (String *st, char *suffix)
{
  int tmp = 1;
  for (int i = st->length - 1, j = strlen (suffix) - 1; j >= 0; j--, i--)
    if (st->elts[i] != suffix[j])
      { tmp = 0; break; }
  return tmp;
}

/* if string starts with prefix return 1 else return 0 */
int
string_starts_with (String *st, char *prefix)
{
  int tmp = 1;
  for (int i = 0, j = 0; j < strlen (prefix); j++, i++)
    if (st->elts[i] != prefix[j])
      { tmp = 0; break; }
  return tmp;
}
  • 测试函数test_string_with代码如下:
/**/
void
test_string_with (void)
{
  String *st = string_new ("<<<Not only a test here!>>>");
  string_info (st);
  if (1 == string_starts_with (st, "<<<"))
    printf ("Starts with <<< !\n");
  if (1 == string_ends_with (st, ">>>"))
    printf ("Ends with >>> !\n");
  string_free (st);
}

编译运行,结果如下:

songvm@ubuntu:~/works/xdn/soo$ gcc string.c -o string
songvm@ubuntu:~/works/xdn/soo$ ./string
<<<Not only a test here!>>>
Page : 4, Length : 27
Starts with <<< !
Ends with >>> !
------------------------------
songvm@ubuntu:~/works/xdn/soo$ 

字符串取字符索引 INDEXOF 和大小写字母转换

  • 字符串取字符索引函数 string_indexof_char
  • 字符串转小写 string_to_lower_case
  • 字符串转大写 string_to_upper_case

代码如下:

/* get index of char, if not found return -1 */
int
string_indexof_char (String *st, char c)
{
  int idx = -1;
  for (int i = 0; i < st->length; i++)
    if (st->elts[i] == c)
      { idx = i; break; }
  return idx;
}

/* to lower case */
void
string_to_lower_case (String *st)
{
  for (int i = 0; i < st->length; i++)
    if (st->elts[i] >= 'A' && st->elts[i] <= 'Z')
      st->elts[i] = st->elts[i] + 32;
}

/* to upper case */
void
string_to_upper_case (String *st)
{
  for (int i = 0; i < st->length; i++)
    if (st->elts[i] >= 'a' && st->elts[i] <= 'z')
      st->elts[i] = st->elts[i] - 32;
}
  • 测试函数test_string_indexof,test_string_to代码如下:
/**/
void
test_string_indexof (void)
{
  String *st = string_new ("Aha test here!");
  string_info (st);
  printf ("Index of char [e] is %d\n", string_indexof_char (st, 'e'));
  printf ("Index of char [X] is %d\n", string_indexof_char (st, 'X'));
  string_free (st);
}

/**/
void
test_string_to (void)
{
  String *st = string_new ("Not only a test!");
  string_info (st);
  string_to_upper_case (st);
  string_info (st);
  string_to_lower_case (st);
  string_info (st);
  string_free (st);
}

编译运行,结果如下:

songvm@ubuntu:~/works/xdn/soo$ gcc string.c -o string
songvm@ubuntu:~/works/xdn/soo$ ./string 
Aha test here!
Page : 2, Length : 14
Index of char [e] is 5
Index of char [X] is -1
------------------------------
Not only a test!
Page : 3, Length : 16
NOT ONLY A TEST!
Page : 3, Length : 16
not only a test!
Page : 3, Length : 16
------------------------------
songvm@ubuntu:~/works/xdn/soo$ 

hash算法,求字符串hashcode的算法有很多种,以下罗列了一些,仅供参考

  • powxn 简单的求x的n次方函数
  • java hashcode method : s[0]*31^(n-1) + s[1]*31^(n-2) + … + s[n-1]
  • string_java_hashcode 代码如下:
/* got x pow n */
static long
powxn (long x, int n)
{
  long ln = (long)n;
  long t = 1;
  while (ln)
    {
      t *= (ln % 2 ? x : 1);
      x *= x;
      ln >>= 1;
    }
  return t;
}

/* java hashcode method */
/* s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] */
unsigned int
string_java_hashcode (String *st)
{
  unsigned int h = 0;
  for (int i = 0, j = st->length - 1; i < st->length; i++, j--)
    h = h + st->elts[i] * powxn (31, j); //31 ^ j;
  return h;
}
  • GLIB中的hash算法
/* another hashcode method */
unsigned int
string_mg_hashcode (String *st)
{
  const char *p = st->elts;
  unsigned int h = *p;
  if (h)
    for (p += 1; *p != '\0'; p++)
      h = (h << 5) - h + *p;
  return h;
}
  • ELF 算法
/* ELF */
unsigned int
string_elf_hashcode (String *st)
{
  int hash = 0, x = 0;
  for (int i = 0; i < st->length; i++)
    {
      hash = (hash << 4) + st->elts[i];
      if ((x = hash & 0xF0000000L) != 0)
	  hash ^= (x >> 24);
      hash &= ~x;
    }
  return (hash & 0x7FFFFFFF);
}
  • JS 算法
/* JS */
unsigned int
string_js_hashcode (String *st)
{
  int hash = 1315423911; //not a prime
  for (int i = 0; i < st->length; i++)
    hash ^= ((hash << 5) + (hash >> 2) + st->elts[i]);
  return (hash & 0x7FFFFFFF);
}
  • RS 算法
/* RS */
unsigned int
string_rs_hashcode (String *st)
{
  int b = 378551; //prime
  int a = 63689;  //prime
  int hash = 0;
  for (int i = 0; i < st->length; i++)
    {
      hash = hash * a + st->elts[i];
      a = a * b;
    }
  return (hash & 0x7FFFFFFF);
}
  • PJW 算法
/* PJW */
unsigned int
string_pjw_hashcode (String *st)
{
  int BitsInUnsignedInt = 32;
  int ThreeQuarters = (BitsInUnsignedInt * 3) / 4;
  int OneEighth = BitsInUnsignedInt / 8;
  int HighBits = 0xFFFFFFFF << (BitsInUnsignedInt - OneEighth);
  int hash = 0;
  int test = 0;
  for (int i = 0; i < st->length; i++)
    {
      hash = (hash << OneEighth) + st->elts[i];
      if ((test = hash & HighBits) != 0)
	hash = ((hash ^ (test >> ThreeQuarters)) & (~HighBits));
    }
  return (hash & 0x7FFFFFFF);
}
  • Jenkins 算法
/* Jenkins */
unsigned int
string_jenkins_hashcode (String *st)
{
  unsigned int hash = 0;
  char *str = st->elts;
  for (unsigned int i = 0; i < st->length; str++, i++)
    {
      hash += (*str) + (hash << 10);
      hash ^= (hash >> 6);
    }
  hash += (hash << 3);
  hash ^= (hash >> 11);
  hash += (hash << 15);
  return (hash & 0x7FFFFFFF);
}
  • DJB 算法
/* DJB */
unsigned int
string_djb_hashcode (String *st)
{
  unsigned int hash = 5381;
  char *str = st->elts;
  while (*str)
    hash += (hash << 5) + (*str++);
  return (hash & 0x7FFFFFFF);
}
  • AP 算法
/* AP */
unsigned int
string_ap_hashcode (String *st)
{
  unsigned int hash = 0;
  char *str = st->elts;
  for (int i=0; *str; i++)
    {
      if ((i & 1) == 0)
	hash ^= ((hash << 7) ^ (*str++) ^ (hash >> 3));
      else
	hash ^= (~((hash << 11) ^ (*str++) ^ (hash >> 5)));
    }
  return (hash & 0x7FFFFFFF);
}
  • 字符串求HASHCODE函数string_hashcode调用以上算法,代码如下:
/* get string hashcode */
unsigned int
string_hashcode (String *st)
{
  //return string_elf_hashcode (st);
  //return string_rs_hashcode (st);
  //return string_js_hashcode (st);
  //return string_pjw_hashcode (st);
  //return string_java_hashcode (st);
  return string_mg_hashcode (st);
  //return string_jenkins_hashcode (st);
  //return string_djb_hashcode (st);
  //return string_ap_hashcode (st);
}
  • 测试函数test_string_hashcode代码如下:
/**/
void
test_string_hashcode (void)
{
  String *st1 = string_new ("www.runoob.com");
  String *st2 = string_new ("Not only a test!");
  String *st3 = string_new ("Also a test");
  String *st4 = string_new ("Other test");
  string_info (st1);
  printf ("Hashcode is %d\n", string_hashcode (st1));
  string_info (st2);
  printf ("Hashcode is %d\n", string_hashcode (st2));
  string_info (st3);
  printf ("Hashcode is %d\n", string_hashcode (st3));
  string_info (st4);
  printf ("Hashcode is %d\n", string_hashcode (st4));
  string_free (st1);
  string_free (st2);
  string_free (st3);
  string_free (st4);
}

编译运行,结果如下:

songvm@ubuntu:~/works/xdn/soo$ gcc string.c -o string
songvm@ubuntu:~/works/xdn/soo$ ./string
www.runoob.com
Page : 2, Length : 14
Hashcode is 321005537
Not only a test!
Page : 3, Length : 16
Hashcode is 2443443497
Also a test
Page : 2, Length : 11
Hashcode is 3333693258
Other test
Page : 2, Length : 10
Hashcode is 1753054146
------------------------------
songvm@ubuntu:~/works/xdn/soo$ 

可以打开string_hashcode函数中的注释来分别调用不同算法查看结果!!!

求HASHCODE在数据结构哈希表中非常重要,涉及到存贮查找的效率问题!!!

string.c 完整代码如下:

/* filename: string.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* compile : gcc string.c -o string
       run : ./string                  */

/* define string page size */
#define SPSIZE 8

/* define String datatype struct _String */
typedef struct _String String;
struct _String {
  char *elts;
  int length;
  int page;
};

/* new string with SPSIZE bytes memory fill 0 */
String *
string_new0 (void)
{
  String *str = (String*) malloc (sizeof(String));
  str->elts = (char*) malloc (SPSIZE * sizeof(char));
  memset (str->elts, 0, SPSIZE);
  str->page = 1; str->length = 0;
  return str;
}

/* new string from char* */
String *
string_new (char *c)
{
  String *str = string_new0 ();
  int len = strlen (c);
  if (len > SPSIZE)
    {
      str->page = len/SPSIZE + 1;
      str->elts = (char*) realloc (str->elts, str->page * SPSIZE);
      memset (str->elts, 0, str->page * SPSIZE);
    }
  for (int i = 0; i < len; i++)
    str->elts[i] = c[i];
  str->length = len;
  return str;
}

/* free the String */
void
string_free (String *str)
{
  free (str->elts);
  free (str);
}

/* append char* to string */
void
string_append (String *st, char *ca)
{
  int len = st->length + strlen (ca);
  if (len > st->page * SPSIZE)
    {
      st->page = len/SPSIZE + 1;
      st->elts = (char*) realloc (st->elts, st->page * SPSIZE);
    }
  for (int i = st->length, j = 0; i < len; i++, j++)
    st->elts[i] = ca[j];
  st->elts[len] = 0;
  st->length = len;
}

/* pre append char* to string */
void
string_prepend (String *st, char *ca)
{
  char *buf, *tmp;
  int len =  strlen (ca);
  int lx = st->length + len;
  if (lx >= st->page * SPSIZE)
    st->page = lx / SPSIZE + 1;
  buf = (char*) malloc (st->page * SPSIZE * sizeof(char));
  memset (buf, 0, st->page * SPSIZE);
  for (int i = 0; i < len; i++)
    buf[i] = ca[i];
  for (int i = len, j = 0; i < lx; i++, j++)
    buf[i] = st->elts[j];
  tmp = st->elts;
  st->length = lx;
  st->elts = buf;
  free (tmp);
}

/* insert char* to string at idx */
void
string_insert (String *st, int idx, char *ca)
{
  char *buf, *tmp;
  int len = strlen (ca);
  int lx = len + st->length;
  if (lx >= st->page * SPSIZE)
      st->page = lx / SPSIZE + 1;
  buf = (char*) malloc (st->page * SPSIZE * sizeof(char));
  memset (buf, 0, st->page * SPSIZE);
  for (int i = 0; i < idx; i++)
    buf[i] = st->elts[i];
  for (int j = idx, k = 0; j < len + idx; j++, k++)
    buf[j] = ca[k];
  for (int i = len + idx, j = idx; i < lx; i++, j++)
    buf[i] = st->elts[j];
  st->length = lx;
  tmp = st->elts;
  st->elts = buf;
  free (tmp);
}

/* erase all at pos to end */
void
string_erase_all (String *st, int pos)
{
  if (pos >= st->length) return; //do nothing
  for (int i = pos; i < st->length; i++)
    st->elts[i] = 0;
  st->length = pos;
}

/* erase section at pos length eq len */
void
string_erase_section (String *st, int pos, int len)
{
  if (pos >= st->length) return; //do nothing
  for (int i = pos; i < pos + len; i++)
    st->elts[i] = 0;
  for (int i = pos + len, j = pos; i < st->length; i++, j++)
    st->elts[j] = st->elts[i];
  for (int i = st->length - len; i < st->length; i++)
    st->elts[i] = 0;
  st->length = st->length - len;
}

/* string trim space tab newline at head and tail */
void
string_trim (String *st)
{
  int start, end;
  char *tmp, *buf;
  buf = (char*) malloc (st->page * SPSIZE * sizeof(char));
  for (int i = 0; i < st->length; i++)
    if (st->elts[i] != ' ' && st->elts[i] != '\t' && st->elts[i] != '\n')
      {	start = i; break; }
  for (int i = st->length - 1; i >=0; i--)
    if (st->elts[i] != ' ' && st->elts[i] != '\t' && st->elts[i] != '\n')
      {	end = i; break; }
  for (int i = start, j = 0; i <= end; i++, j++)
    buf[j] = st->elts[i];
  st->length = end - start + 1;
  tmp = st->elts;
  st->elts = buf;
  free (tmp);
}

/* reverse string */
void
string_reverse (String *st)
{
  for (int i = 0, n = st->length - 1; i < st->length / 2; i++, n--)
    {
      char t = st->elts[i];
      st->elts[i] = st->elts[n];
      st->elts[n] = t;
    }
}

/* get substring from a string */
String*
string_sub (String *st, int pos, int len)
{
  String *tmp = NULL;
  int ln = 0;
  if (pos >= st->length) return tmp;
  if ((pos + len) > st->length)
    ln = st->length;
  else
    ln = pos + len;
  tmp= string_new ("");
  for (int i = pos, j = 0; i < ln; i++, j++)
    tmp->elts[j] = st->elts[i];
  tmp->length = len;
  return tmp;
}

/* test src eq dst if true return 1 else return 0 */
static int
streq (char *src, char *dst)
{
  for (int i = 0; i < strlen (dst); i++)
    if (src[i] != dst[i]) return 0;
  return 1;
}

/* replace src in string to dst */
void
string_replace (String *st, char *src, char *dst)
{
  int i, j, k = -1;
  int ls = strlen (src);
  int ld = strlen (dst);
  char *buf, *tmp = st->elts;
  if (ls > st->length)
    { printf ("Info: String no change!\n"); return; }
  for (i = 0; i < st->length - ls + 1; i++)
    if (1 == streq (&tmp[i], src))
      { k = i; break; }
  if (k == -1) { printf ("Info: String not found!\n"); return; }

  if (ls == ld)
    {
      for (i = 0, j = k; j < k + ls; j++, i++)
	st->elts[j] = dst[i];
    }
  else
    {
      int ln = st->length;
      ln = ln + ld - ls;
      if (ls < ld)
	st->page = ln / SPSIZE + 1;
      buf = (char*) malloc (st->page * SPSIZE * sizeof(char));
      for (i = 0; i < k; i++)
	buf[i] = st->elts[i];
      for (int n = 0; n < ld; n++, i++)
	buf[i] = dst[n];
      for (int n = k + ls; n < st->length; n++, i++)
	buf[i] = st->elts[n];
      st->length = ln;
      tmp = st->elts;
      st->elts = buf;
      free (tmp);
    }
}

/* if string ends with suffix return 1 else return 0 */
int
string_ends_with (String *st, char *suffix)
{
  int tmp = 1;
  for (int i = st->length - 1, j = strlen (suffix) - 1; j >= 0; j--, i--)
    if (st->elts[i] != suffix[j])
      { tmp = 0; break; }
  return tmp;
}

/* if string starts with prefix return 1 else return 0 */
int
string_starts_with (String *st, char *prefix)
{
  int tmp = 1;
  for (int i = 0, j = 0; j < strlen (prefix); j++, i++)
    if (st->elts[i] != prefix[j])
      { tmp = 0; break; }
  return tmp;
}

/* get index of char, if not found return -1 */
int
string_indexof_char (String *st, char c)
{
  int idx = -1;
  for (int i = 0; i < st->length; i++)
    if (st->elts[i] == c)
      { idx = i; break; }
  return idx;
}

/* to lower case */
void
string_to_lower_case (String *st)
{
  for (int i = 0; i < st->length; i++)
    if (st->elts[i] >= 'A' && st->elts[i] <= 'Z')
      st->elts[i] = st->elts[i] + 32;
}

/* to upper case */
void
string_to_upper_case (String *st)
{
  for (int i = 0; i < st->length; i++)
    if (st->elts[i] >= 'a' && st->elts[i] <= 'z')
      st->elts[i] = st->elts[i] - 32;
}

/* got x pow n */
static long
powxn (long x, int n)
{
  long ln = (long)n;
  long t = 1;
  while (ln)
    {
      t *= (ln % 2 ? x : 1);
      x *= x;
      ln >>= 1;
    }
  return t;
}

/* java hashcode method */
/* s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] */
unsigned int
string_java_hashcode (String *st)
{
  unsigned int h = 0;
  for (int i = 0, j = st->length - 1; i < st->length; i++, j--)
    h = h + st->elts[i] * powxn (31, j); //31 ^ j;
  return h;
}

/* another hashcode method */
unsigned int
string_mg_hashcode (String *st)
{
  const char *p = st->elts;
  unsigned int h = *p;
  if (h)
    for (p += 1; *p != '\0'; p++)
      h = (h << 5) - h + *p;
  return h;
}

/* ELF */
unsigned int
string_elf_hashcode (String *st)
{
  int hash = 0, x = 0;
  for (int i = 0; i < st->length; i++)
    {
      hash = (hash << 4) + st->elts[i];
      if ((x = hash & 0xF0000000L) != 0)
	  hash ^= (x >> 24);
      hash &= ~x;
    }
  return (hash & 0x7FFFFFFF);
}

/* JS */
unsigned int
string_js_hashcode (String *st)
{
  int hash = 1315423911; //not a prime
  for (int i = 0; i < st->length; i++)
    hash ^= ((hash << 5) + (hash >> 2) + st->elts[i]);
  return (hash & 0x7FFFFFFF);
}

/* RS */
unsigned int
string_rs_hashcode (String *st)
{
  int b = 378551; //prime
  int a = 63689;  //prime
  int hash = 0;
  for (int i = 0; i < st->length; i++)
    {
      hash = hash * a + st->elts[i];
      a = a * b;
    }
  return (hash & 0x7FFFFFFF);
}

/* PJW */
unsigned int
string_pjw_hashcode (String *st)
{
  int BitsInUnsignedInt = 32;
  int ThreeQuarters = (BitsInUnsignedInt * 3) / 4;
  int OneEighth = BitsInUnsignedInt / 8;
  int HighBits = 0xFFFFFFFF << (BitsInUnsignedInt - OneEighth);
  int hash = 0;
  int test = 0;
  for (int i = 0; i < st->length; i++)
    {
      hash = (hash << OneEighth) + st->elts[i];
      if ((test = hash & HighBits) != 0)
	hash = ((hash ^ (test >> ThreeQuarters)) & (~HighBits));
    }
  return (hash & 0x7FFFFFFF);
}

/* Jenkins */
unsigned int
string_jenkins_hashcode (String *st)
{
  unsigned int hash = 0;
  char *str = st->elts;
  for (unsigned int i = 0; i < st->length; str++, i++)
    {
      hash += (*str) + (hash << 10);
      hash ^= (hash >> 6);
    }
  hash += (hash << 3);
  hash ^= (hash >> 11);
  hash += (hash << 15);
  return (hash & 0x7FFFFFFF);
}

/* DJB */
unsigned int
string_djb_hashcode (String *st)
{
  unsigned int hash = 5381;
  char *str = st->elts;
  while (*str)
    hash += (hash << 5) + (*str++);
  return (hash & 0x7FFFFFFF);
}

/* AP */
unsigned int
string_ap_hashcode (String *st)
{
  unsigned int hash = 0;
  char *str = st->elts;
  for (int i=0; *str; i++)
    {
      if ((i & 1) == 0)
	hash ^= ((hash << 7) ^ (*str++) ^ (hash >> 3));
      else
	hash ^= (~((hash << 11) ^ (*str++) ^ (hash >> 5)));
    }
  return (hash & 0x7FFFFFFF);
}

/* get string hashcode */
unsigned int
string_hashcode (String *st)
{
  //return string_elf_hashcode (st);
  //return string_rs_hashcode (st);
  //return string_js_hashcode (st);
  //return string_pjw_hashcode (st);
  //return string_java_hashcode (st);
  return string_mg_hashcode (st);
  //return string_jenkins_hashcode (st);
  //return string_djb_hashcode (st);
  //return string_ap_hashcode (st);
}

/* ------------------------------ */

/* output string infomation for test */
void
string_info (String *st)
{
  printf ("%s\n", st->elts);
  printf ("Page : %d, Length : %d\n", st->page, st->length);
}

/**/
void
test_string_new (void)
{
  String *sta = string_new ("");
  String *stb = string_new ("Not only a test!");
  string_info (sta);
  string_info (stb);
  string_free (sta);
  string_free (stb);
}

/**/
void
test_string_append (void)
{
  String *st = string_new ("Not");
  string_info (st);
  string_append (st, " only");
  string_info (st);
  string_append (st, " a");
  string_info (st);
  string_append (st, " test");
  string_info (st);
  string_append (st, " here!");\
  string_info (st);
  string_free (st);
}

/**/
void
test_string_prepend (void)
{
  String *st = string_new ("AAA");
  string_info (st);
  string_prepend (st, "BBB ");
  string_info (st);
  string_prepend (st, "CCC ");
  string_info (st);
  string_prepend (st, "DDD ");
  string_info (st);
  string_prepend (st, "EEE ");
  string_info (st);
  string_free (st);
}

/**/
void
test_string_insert (void)
{
  String *st = string_new ("AA  AA");
  string_info (st);
  string_insert (st, 3, "BB  BB");
  string_info (st);
  string_insert (st, 6, "CC  CC");
  string_info (st);
  string_insert (st, 9, "DD  DD");
  string_info (st);
  string_insert (st, 12, "EE  EE");
  string_info (st);
  string_free (st);
}

/**/
void
test_string_erase (void)
{
  String *st = string_new ("AAABBBCCCXXXYYYZZZ");
  string_info (st);
  string_erase_all (st, 8);
  string_info (st);
  string_free (st);
  st = string_new ("AAABBBCCCXXXYYYZZZ");
  string_erase_section (st, 8, 7);
  string_info (st);
  string_free (st);
}

/**/
void
test_string_trim (void)
{
  String *sta = string_new ("www.baidu.com");
  String *stb = string_new ("  www.baidu.com");
  String *stc = string_new ("www.baidu.com   ");
  String *std = string_new ("  www.baidu.com   ");
  string_trim (sta);
  string_info (sta);
  string_trim (stb);
  string_info (stb);
  string_trim (stc);
  string_info (stc);
  string_trim (std);
  string_info (std);
  string_free (sta);
  string_free (stb);
  string_free (stc);
  string_free (std);
}

/**/
void
test_string_reverse (void)
{
  String *st = string_new ("ABCDEFGHIJKLMNOPQRSTUVWXYZ0");
  string_info (st);
  string_reverse (st);
  string_info (st);
  string_free (st);
}

/**/
void
test_string_sub (void)
{
  String *tmp;
  String *st = string_new ("Another string object test!");
  string_info (st);
  tmp = string_sub (st, 8, 6);
  if (tmp == NULL)
    printf ("Get substring is NULL!\n");
  else
    {
      string_info (tmp);
      string_free (tmp);
    }
  string_free (st);
}

/**/
void
test_string_replace (void)
{
  String *sa, *st;
  st = string_new ("Not only a test here!");
  string_info (st);
  printf ("--------------\nreplace a to XXXX\n");
  string_replace (st, "a", "XXXX");
  string_info (st);
  printf ("--------------\nreplace XXXX to a\n");
  string_replace (st, "XXXX", "a");
  string_info (st);
  printf ("--------------\n");
  sa = string_new ("Hello [name], good lucky!");
  string_info (sa);
  string_replace (sa, "[name]", "Jack Tomson");
  string_info (sa);
  string_free (sa);
  string_free (st);
}

/**/
void
test_string_with (void)
{
  String *st = string_new ("<<<Not only a test here!>>>");
  string_info (st);
  if (1 == string_starts_with (st, "<<<"))
    printf ("Starts with <<< !\n");
  if (1 == string_ends_with (st, ">>>"))
    printf ("Ends with >>> !\n");
  string_free (st);
}

/**/
void
test_string_indexof (void)
{
  String *st = string_new ("Aha test here!");
  string_info (st);
  printf ("Index of char [e] is %d\n", string_indexof_char (st, 'e'));
  printf ("Index of char [X] is %d\n", string_indexof_char (st, 'X'));
  string_free (st);
}

/**/
void
test_string_to (void)
{
  String *st = string_new ("Not only a test!");
  string_info (st);
  string_to_upper_case (st);
  string_info (st);
  string_to_lower_case (st);
  string_info (st);
  string_free (st);
}

/**/
void
test_string_hashcode (void)
{
  String *st1 = string_new ("www.runoob.com");
  String *st2 = string_new ("Not only a test!");
  String *st3 = string_new ("Also a test");
  String *st4 = string_new ("Other test");
  string_info (st1);
  printf ("Hashcode is %u\n", string_hashcode (st1));
  string_info (st2);
  printf ("Hashcode is %u\n", string_hashcode (st2));
  string_info (st3);
  printf ("Hashcode is %u\n", string_hashcode (st3));
  string_info (st4);
  printf ("Hashcode is %u\n", string_hashcode (st4));
  string_free (st1);
  string_free (st2);
  string_free (st3);
  string_free (st4);
}

/**/
#define outline() printf ("------------------------------\n")

/**/
int
main (int argc, char *argv[])
{
  //test_string_new (); outline ();
  //test_string_append (); outline ();
  //test_string_prepend (); outline ();
  //test_string_insert (); outline ();
  //test_string_erase (); outline ();
  //test_string_trim (); outline ();
  //test_string_reverse (); outline ();
  //test_string_sub (); outline();
  //test_string_replace (); outline ();
  //test_string_with (); outline ();
  //test_string_indexof (); outline ();
  //test_string_to (); outline ();
  test_string_hashcode (); outline ();
  return 0;
}
/* --):-o-:(-- */

还有一些String的功能未实现,欢迎补充!!!下一步研究其他数据结构!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值