<?xml version="1.0" encoding="gb2312" ?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">

<channel about="http://www.zhanglihai.com/b/rss2_6.xml">
<title>My Window,Your Bridge!</title> 
<link>http://www.zhanglihai.com/b/rss2_6.xml</link>
<description>关于技术,关于生活！</description>
<language>zh-cn</language>
<copyright>O-blog</copyright><item>
<title>模仿Linux下的cal 程序</title>
<link>http://www.zhanglihai.com/b/rss2_6.xml/archives/2008/02/22/linux_c_cal_calendar.html</link>
<pubDate>Fri, 22 Feb 2008 14:25:45 +0800</pubDate>
<guid>http://www.zhanglihai.com/b/rss2_6.xml/archives/2008/02/22/linux_c_cal_calendar.html</guid>
<description><![CDATA[ 命令行下的calendar工具<br /><br /><div class="ubbcode"><br /><br />#include &lt;stdio.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;time.h&gt;<br />#include &lt;unistd.h&gt;<br />#include &lt;string.h&gt;<br />/****************************<br /> *<br /> * 模仿Linux 下的  cal命令<br /> * <br /> * cal<br /> * 无参数显示当前月日历<br /> * -h      帮助信息<br /> * -m      指定月(1--12)<br /> * -y      指定年(&gt;1900)<br /> * -j      显示本年的第几天，默认显示日期<br /> * -y,-m   缺省为当前年、月<br /> * <br /> * for example:<br /> * <br /> * $&gt;cal -y 1997 -m 12<br /> * $&gt;cal -y 1997<br /> * $&gt;cal -m 12<br /> * $&gt;cal -y 2008 -j<br /> * <br /> * <br /> * 操作系统对year的限制不同<br /> * Window  ：一般从1970~2038<br /> * Linux   : 基本没有限制<br /> * <br /> * <br /> * <br /> * author:zhanglihai<br /> * date  : 2008/02/20<br /> * **************************/<br />//定义月的英文描述<br />char *month_name_en[12]={&quot;January&quot;,&quot;February&quot;,&quot;March&quot;,&quot;April&quot;,&quot;May&quot;,&quot;June&quot;,&quot;July&quot;,&quot;August&quot;,&quot;September&quot;,&quot;October&quot;,&quot;November&quot;,&quot;December&quot;};<br />char *week_name_en[7]={&quot;Sun&quot;, &quot;Mon&quot;, &quot;Tue&quot;,&quot;Wed&quot;, &quot;Thu&quot;, &quot;Fri&quot;, &quot;Sat&quot;};<br />char *animals[12] = { &quot;鼠&quot;, &quot;牛&quot;, &quot;虎&quot;, &quot;兔&quot;,<br />                        &quot;龙&quot;, &quot;蛇&quot;, &quot;马&quot;, &quot;羊&quot;, &quot;猴&quot;, &quot;鸡&quot;, &quot;狗&quot;, &quot;猪&quot; };<br />int   month_max_day[12]={31,28,31,30,31,30,31,31,30,31,30,31};<br />typedef struct tm Date;<br />typedef struct tm *PDate;<br /><br /><br /><br />void printHelp(){<br />        printf(&quot;\n模仿Linux 下的  cal命令&quot;<br />                        &quot;\n\n&quot;<br />                        &quot;cal\n&quot;<br />                        &quot;无参数显示当前月日历&quot;<br />                        &quot;\n\n&quot;<br />                        &quot;-h      帮助信息\n&quot;<br />                        &quot;-m      指定月(1--12)\n&quot;<br />                        &quot;-y      指定年(&gt;1900)\n&quot;<br />                        &quot;-j      显示本年的第几天，默认显示日期\n&quot;<br />                        &quot;\n\n&quot;<br />                        &quot;-y,-m   缺省为当前年、月\n&quot;<br />                        &quot;\n&quot;<br />                        &quot;for example:\n&quot;<br />                        &quot;$&gt;cal -y 1997 -m 12\n&quot;<br />                        &quot;$&gt;cal -y 1997\n&quot;<br />                        &quot;$&gt;cal -m 12\n&quot;<br />                        &quot;$&gt;cal -y 2008 -j \n&quot;<br />                        &quot;\n&quot;<br />                        &quot;操作系统对year的限制不同\n&quot;<br />                     &quot;Window  ：一般从1970~2038\n&quot;<br />                        &quot;Linux   : 基本没有限制\n&quot;<br />                        &quot;\n\n&quot;<br />                        &quot;                                           author : zhanglihai\n&quot;<br />                        &quot;                                           date   : 2008/02/20\n&quot;);        <br />}<br /><br /><br />int monthMaxDay(int y,int m){<br />        int y1=y+1900;<br />        if(m==1)<br />        {<br />           if((y1%400==0)||(y1%4==0&amp;&amp;y1%100!=0))<br />             return 29;<br />        }        <br />        return month_max_day[m];<br />}<br /><br />void printYearCal(PDate pdate,int fmt)<br />{<br />        int i,j,w,left;<br />        int m_len;<br />        int max_day1,max_day2;<br />        int day1,day2,gday1,gday2;<br />        int wday1,wday2;<br />        int year=pdate-&gt;tm_year;<br />        time_t _tm;<br />        PDate  _pdate;<br />                    pdate-&gt;tm_mon=0;<br />                    pdate-&gt;tm_mday=1;<br />                   _tm=mktime(pdate);<br />                 if(_tm==-1)<br />                 {<br />                   printf(&quot;can't   mktime . \n&quot;);<br />                   printf(&quot;-h    help info.\n&quot;);<br />                   return;        <br />                 }<br />        printf(&quot;\n%*d %s\n\n&quot;,(27*2-4*2-4)/2+10,pdate-&gt;tm_year+1900,animals[((pdate-&gt;tm_year+1900)-4)%12]);<br />                   _pdate=localtime(&amp;_tm);<br />                   wday1=_pdate-&gt;tm_wday;<br />        day1=day2=gday1=gday2=1;<br />        for(i=0;i&lt;12;i+=2)<br />        {<br />                    day1=day2=1;<br />                    max_day1=monthMaxDay(year,i);<br />         max_day2=monthMaxDay(year,i+1);<br />         wday2=(max_day1-(7-wday1))%7;<br />                //输出月英文名字<br />                m_len=strlen(month_name_en[i]);<br />                left=(27-m_len)/2+m_len;<br />                printf(&quot;%*s&quot;,left,month_name_en[i]);<br />                //剩下的位置用空格补齐<br />                for(j=0;j&lt;27-left;j++)<br />                  printf(&quot; &quot;);<br />                //输出4个空格作为间隔<br />                for(j=0;j&lt;4;j++)<br />                  printf(&quot; &quot;);<br />          //输出横排第二个月的名字          <br />           m_len=strlen(month_name_en[i+1]);<br />           left=(27-m_len)/2+m_len;<br />           printf(&quot;%*s\n&quot;,left,month_name_en[i+1]);<br />           <br />           //开始输出星期的英文名字<br />           printf(&quot;%s&quot;,week_name_en[0]);<br />           for(j=1;j&lt;7;j++)<br />           {<br />                     printf(&quot;%4s&quot;,week_name_en[j]);<br />           }<br />           for(j=0;j&lt;4;j++)<br />             printf(&quot; &quot;);<br />                      printf(&quot;%s&quot;,week_name_en[0]);<br />           for(j=1;j&lt;7;j++)<br />           {<br />                     printf(&quot;%4s&quot;,week_name_en[j]);<br />           }<br />           printf(&quot;\n&quot;);  <br />           //星期的英文名字输出完毕<br />           //开始输出当前月的日期<br />           //一行一行的输出，同时输出两个月的<br />           //每个月的日期是一个6*7的方形矩阵 <br />           <br />           //先输出第一个行，<br /><br />             if(i!=0){<br />               gday2=gday1+max_day1;<br />             }<br />             else<br />               gday2=1+max_day1;<br />             //输出站位空字符 <br />         for(w=0;w&lt;wday1;w++)<br />         {<br />                   if(w==0)<br />                     printf(&quot;%3s&quot;,&quot; &quot;);<br />                   else<br />                     printf(&quot;%4s&quot;,&quot; &quot;);<br />         }<br />         //输出日期<br />         for(;w&lt;7;w++)<br />         {<br />                 if(w==0){<br />                     printf(&quot;%3d&quot;,fmt?gday1:day1);<br />                  }<br />                  else{<br />                     printf(&quot;%4d&quot;,fmt?gday1:day1);<br />                   }<br />                   day1++;<br />                   gday1++;<br />         }<br />         //第一个月的第一行输出完毕<br />         //输出4个空格作为间隔<br />         printf(&quot;%4s&quot;,&quot; &quot;);<br />             //输出第二个月的第一行<br />             //此处应该可以根据上一个月算出从第几个开始<br />             <br />                   //输出站位空字符 <br />            for(w=0;w&lt;wday2;w++)<br />         {<br />                   if(w==0)<br />                     printf(&quot;%3s&quot;,&quot; &quot;);<br />                   else<br />                     printf(&quot;%4s&quot;,&quot; &quot;);<br />         }  <br />             //输出日期<br /><br />         for(;w&lt;7;w++)<br />         {<br />                 if(w==0){<br />                     printf(&quot;%3d&quot;,fmt?gday2:day2);<br />                  }<br />                  else{<br />                     printf(&quot;%4d&quot;,fmt?gday2:day2);<br />                   }<br />                   day2++;<br />                   gday2++;<br />         }<br />           printf(&quot;\n&quot;);<br />           //开始下面的输出<br />           for(j=1;j&lt;6;j++)<br />           {<br />                   //第一个矩阵<br />         //开始输出日期<br />          for(w=0;w&lt;7;w++)<br />          {<br />                  if(day1&lt;=max_day1)<br />                  {<br />                          if(w==0){<br />                             printf(&quot;%3d&quot;,fmt?gday1:day1);<br />                          }<br />                          else{<br />                             printf(&quot;%4d&quot;,fmt?gday1:day1);<br />                           }<br />                           day1++;<br />                           gday1++;<br />                  }else{<br />                           if(w==0)<br />                       printf(&quot;%3s&quot;,&quot; &quot;);<br />                       else<br />                       printf(&quot;%4s&quot;,&quot; &quot;);        <br />                  }<br />          }<br />             printf(&quot;%4s&quot;,&quot; &quot;);    <br />          <br />                //第二个矩阵 <br />              //gday2=gday1+max_day1;<br />          for(w=0;w&lt;7;w++)<br />          {<br />                  if(day2&lt;=max_day2)<br />                  {<br />                    if(w==0)<br />                      printf(&quot;%3d&quot;,fmt?gday2:day2);<br />                     else<br />                       printf(&quot;%4d&quot;,fmt?gday2:day2);<br />                           day2++;<br />                           gday2++;<br />                  }else{<br />                  <br />                           if(w==0)<br />                       printf(&quot;%3s&quot;,&quot; &quot;);<br />                       else<br />                       printf(&quot;%4s&quot;,&quot; &quot;);        <br />                  }<br />          }<br />          printf(&quot;\n&quot;);<br />           }<br />                   gday1=gday2;<br />                   wday1=(max_day1-(7-wday2)) % 7;<br />        }<br />        printf(&quot;\n&quot;);<br />}<br /><br />void printMonthOnYearCal(PDate date,int fmt){<br />        int i;<br />        int m_len;<br />        int day;<br />        int max_day;<br />        int p=1;<br />        max_day=monthMaxDay(date-&gt;tm_year,date-&gt;tm_mon);<br />        printf(&quot;%*s %d %s\n&quot;,(27-(m_len=strlen(month_name_en[date-&gt;tm_mon])))/2+m_len-4,month_name_en[date-&gt;tm_mon],date-&gt;tm_year+1900,animals[((date-&gt;tm_year+1900)-4)%12]);<br />        printf(week_name_en[0]);<br />        for(i=1;i&lt;7;i++)<br />        {<br />           printf(&quot;%*s&quot;,4,week_name_en[i]);        <br />        }<br />        printf(&quot;\n&quot;);<br />        for(i=0;i&lt;date-&gt;tm_wday;i++)<br />        {<br />          if(i==0)<br />            printf(&quot;%*s&quot;,3,&quot; &quot;);<br />          else<br />             printf(&quot;%*s&quot;,4,&quot; &quot;);<br />        }<br />         day=1; <br />         if(fmt==1)<br />            day=date-&gt;tm_yday+1;<br />        for(;i&lt;7;i++){<br />                if(i==0)<br />              printf(&quot;%*d&quot;,3,day++);<br />            else<br />              printf(&quot;%*d&quot;,4,day++);<br />          if(i==6){<br />             i=-1; <br />               printf(&quot;\n&quot;);<br />          }<br />          if(p++&gt;=max_day)<br />            break;<br />        }<br />        printf(&quot;\n&quot;); <br />         <br />}<br />int main(int argc,char *argv[]){<br />        int y;<br />        int m;<br />        int fmt;<br />        fmt=0;<br />        y=-1;<br />        m=-1;<br />        time_t c_tm;<br />        time_t c_tm2;<br /><br />        PDate pdate;<br />        PDate pdate2;<br />        int i;<br />        for(i=1;i&lt;argc;)<br />        {<br />           if(!strcmp(argv[i],&quot;-m&quot;)&amp;&amp;(i+1&lt;argc))<br />           {<br />                     m=atoi(argv[i+1])-1;<br />                     if(m&lt;0||m&gt;11)<br />                     {<br />                                     printf(&quot;month  range (1~12)\n&quot;);<br />                                     printf(&quot;-h    help info.\n&quot;);<br />                                     exit(0);<br />                                     return 0;<br />                     }<br />                     i+=2;<br />           }        <br />           else if(!strcmp(argv[i],&quot;-y&quot;) &amp;&amp; (i+1&lt;argc)){<br />                     y = atoi(argv[i+1])-1900;<br />                     if(y&lt;=0)<br />                     {<br />                                     printf(&quot;year range (&gt;1900)\n&quot;);<br />                                printf(&quot;-h    help info.\n&quot;);<br />                                     exit(0);<br />                                     return 0;<br />                     }<br />                     i+=2;<br />           }else if(!strcmp(argv[i],&quot;-j&quot;))<br />           {<br />                     i++;<br />                     fmt=1;<br />           }else if(!strcmp(argv[i],&quot;-h&quot;))<br />           {<br />                       printHelp();<br />                       exit(0);<br />                       return 0;<br />           }else {<br />                       printHelp();<br />                       exit(0);<br />                       return 0;<br />           }<br />        }<br />        time(&amp;c_tm);<br />        pdate=localtime(&amp;c_tm);<br />        if(m==-1)<br />        {<br />                if(y&gt;0)<br />                {<br />                        pdate-&gt;tm_year=y;<br />                        printYearCal(pdate,fmt);                <br />                }else{<br />                          printMonthOnYearCal(pdate,fmt);<br />                }<br />        }else{<br />                if(y&gt;0)<br />                {<br />                        pdate-&gt;tm_year=y;<br />                        pdate-&gt;tm_mon=m;<br />                        pdate-&gt;tm_mday=1;<br />                        c_tm2=mktime(pdate);<br />                        if(c_tm2==-1)<br />                         {<br />                           printf(&quot;can't mktime . \n&quot;);<br />                           printf(&quot;-h    help info.\n&quot;);<br />                            exit(0);<br />                            return 0;        <br />                         }<br />                        pdate2=localtime(&amp;c_tm2);<br />                        printMonthOnYearCal(pdate2,fmt);                <br />                }else{<br />                           printMonthOnYearCal(pdate,fmt);<br />                }        <br />        }<br />  return 0;        <br />}<br />        <br /><br /><br /></div><br /><br />update:<br /> 增加了一个小功能，可以在控制台输出带颜色的字体。<br />引用windows.h文件调用里面的<br />   HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);<br />   if(h)<br />         SetConsoleTextAttribute(h,color);        <br />可以达到效果,只更新了-h,及月视图的颜色，如果年视图带颜色感觉有点乱了：）<br /><br />看截图及最新代码下载<br /><br /><br /><br /><div style="overflow:auto;width:440px"><a href="http://www.zhanglihai.com/b//uploadfiles/cal_cmd_40845.jpg" target="_blank"><img src="http://www.zhanglihai.com/b//uploadfiles/cal_cmd_40845.jpg" alt="http://www.zhanglihai.com/b//uploadfiles/cal_cmd_40845.jpg" border="0" class="ubbimg" /></a></div><br /><br /><br /><div style="overflow:auto;width:440px"><a href="http://www.zhanglihai.com/b//uploadfiles/cal_cmd_99192.jpg" target="_blank"><img src="http://www.zhanglihai.com/b//uploadfiles/cal_cmd_99192.jpg" alt="http://www.zhanglihai.com/b//uploadfiles/cal_cmd_99192.jpg" border="0" class="ubbimg" /></a></div><br /><br /><br /><a href="http://www.zhanglihai.com/b//uploadfiles/cal_69841.c" target="_blank">http://www.zhanglihai.com/b//uploadfiles/cal_69841.c</a><br /><br />屏幕带颜色的代码<br /><br /><a href="http://www.zhanglihai.com/b//uploadfiles/cal_41820.c" target="_blank">http://www.zhanglihai.com/b//uploadfiles/cal_41820.c</a><br /><br />EXE文件下载。<br /><br /><a href="http://www.zhanglihai.com/b//uploadfiles/cal_exe_57206.zip" target="_blank">http://www.zhanglihai.com/b//uploadfiles/cal_exe_57206.zip</a>]]></description>
</item><item>
<title>C hash结构的实现.</title>
<link>http://www.zhanglihai.com/b/rss2_6.xml/archives/2008/01/07/c_hashtable.html</link>
<pubDate>Mon, 07 Jan 2008 18:05:29 +0800</pubDate>
<guid>http://www.zhanglihai.com/b/rss2_6.xml/archives/2008/01/07/c_hashtable.html</guid>
<description><![CDATA[ 非同步的hash结构的简单实现。<br /><br />根据不同的key用hash函数计算出在数组中的位置，数组中保存的是一个链表结构的结构，不同key在hash值相同的情况下，可以用链表来控制在内存中的位置。<br /><br />hashtable.h文件.<br /><br /><div class="ubbcode"><br />/*****************************************<br /> *  FILE   : hashtable.h<br /> *  DATE   : 2008/01/06<br /> *  AUTHOR : ZhangLiHai<br /> * ***************************************/<br />#ifndef HASHTABLE_H_<br />#define HASHTABLE_H_<br />#include &lt;stdio.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;malloc.h&gt;<br />typedef struct __hash_entry hash_entry;<br />typedef struct __hash_entry* p_hash_entry;<br />typedef struct __hash_table hashtable;<br />typedef struct __hash_table* p_hashtable;<br /><br />typedef int BOOL;<br />#define TRUE 1<br />#define FALSE 0<br />struct __hash_entry{<br />         p_hash_entry next;//next entry<br />         unsigned int hash_code;//key hash_code...<br />         const char* key; //key..<br />         const void* value;//value object<br />         int klen; //entry size.<br />};<br />struct __hash_table{<br />        int capacity;// array length.<br />        int size;//cur size<br />        unsigned int (*hash_code_fp)(const char*);//hash_code function pointer.<br />        void (*value_free_fp)(void*);<br />        void (*key_free_fp)(char*);<br />        p_hash_entry *array; //entry array;<br />};<br /><br />//foreach function pointer.<br />typedef  BOOL (*hash_foreach_fp)(p_hash_entry);<br /><br />/***********************<br /> * <br /> * 创建一个hashtable指针<br /> * <br /> * *********************/<br />p_hashtable new_hashtab();<br /><br />p_hash_entry new_entry();<br /><br />/***************************************<br /> * <br /> * 将key,value放入hash结构里面<br /> * <br /> * *************************************/<br />BOOL hash_put(p_hashtable,const char*, const void*);<br /><br /><br />/******************************************<br /> * <br /> * <br /> * 根据key返回一个void *<br /> * <br /> * <br /> * ******************************************/<br />void* hash_get(p_hashtable,const char*);<br /><br />/*****************************************<br /> * <br /> * 重新分配hash空间<br /> * <br /> * 重新规划元素的位置 <br /> * ***************************************/<br />BOOL hash_resize(p_hashtable );<br /><br /><br /><br />/****************************************<br /> * <br /> * <br /> * hash code算法的默认实现~<br /> * <br /> * <br /> * **************************************/<br />unsigned int hash_code_fp_default(const char*);<br /><br /><br />/**************<br /> * <br /> * <br /> * 删除某个key下的值<br /> * <br /> * <br /> * <br /> * **********************/<br />BOOL hash_remove_key(p_hashtable,  const char*);<br /><br />/********************<br /> * <br /> * 清除hash里面的所有数据，但是保存hashtable本身<br /> * <br /> * **********************/<br />BOOL hash_data_clear(p_hashtable );<br /><br /><br />/*****************<br /> *<br /> * 看某个key是否在hash里面<br /> * <br /> * ************************/<br />BOOL hash_contains_key(p_hashtable,  const char*);<br />/**************************<br /> * 迭代函数<br /> * 一个是清楚数据，另一个没有清除<br /> * ******************/<br />void hash_foreach_no_clear(p_hashtable,hash_foreach_fp);<br />void hash_foreach_clear(p_hashtable,hash_foreach_fp);<br />/********************************<br /> * <br /> * 两个默认的free方法，调用stdlib的free函数<br /> * <br /> * *******************************/<br />void std_key_free(char *);<br />void std_value_free(void *);<br /><br />/************************<br /> * <br /> * 回收一个hashtable指针<br /> * <br /> * 如果里面的value需要回收，则传入一个函数指针<br /> * <br /> * ************************/<br />BOOL free_hashtab(p_hashtable );<br /><br />#endif /*HASHTABLE_H_*/<br /></div><br /><br />hashtable.c文件包含测试<br /><div class="ubbcode"><br /> /*****************************************<br /> *  FILE   : hashtable.c<br /> *  DATE   : 2008/01/06<br /> *  AUTHOR : ZhangLiHai<br /> * ***************************************/<br />#include &quot;hashtable.h&quot;<br /><br />#define MAX_SIZE 1024<br />#define HASH_IND(h,n) ((h)%(n))<br /><br />p_hashtable new_hashtab(){<br />  p_hashtable tab;<br />       tab = (p_hashtable)malloc(sizeof(struct __hash_table));<br />       printf(&quot;new hashtable \n&quot;);<br />       tab-&gt;size=0;<br />       tab-&gt;capacity=MAX_SIZE;<br />       tab-&gt;array=(p_hash_entry*)calloc(tab-&gt;capacity,sizeof(p_hash_entry));<br />       printf(&quot;new hashtable-&gt;array pointer. \n&quot;);<br />       tab-&gt;hash_code_fp=&amp;hash_code_fp_default;<br />       tab-&gt;value_free_fp=NULL;<br />       tab-&gt;key_free_fp=NULL;<br />        return tab;        <br />}<br /><br />p_hash_entry new_entry(){<br />  p_hash_entry this;<br />             this = (p_hash_entry)malloc(sizeof(struct __hash_entry));<br />             this-&gt;hash_code=0;<br />             this-&gt;key=NULL;<br />             this-&gt;klen=0;<br />             this-&gt;next=NULL;<br />             this-&gt;value=NULL;<br />             printf(&quot;new entry . \n&quot;);<br />           return this;<br />}<br />unsigned int hash_code_fp_default(const char* key){<br />  register unsigned  int hash;        <br />        for(hash=0;*key;key++)<br />           hash = *key+hash*31;<br />  return abs(hash);<br />}<br /><br />void std_key_free(char *p){<br />        if(p)<br />          free(p);        <br />}<br /><br />void std_value_free(void *p){<br />        if(p)<br />          free(p);<br />}<br /><br /><br />BOOL hash_remove_key(p_hashtable tab,  const char* key)<br />{<br />        void* value;<br />        p_hash_entry e,prev,next;<br />    int hash,ind;<br />    if(!tab||!key)return FALSE;<br />            hash=tab-&gt;hash_code_fp(key);<br />            ind=HASH_IND(hash,tab-&gt;capacity);<br />        e=tab-&gt;array[ind];<br />        prev=e;<br />        next=NULL;<br />        while(e)<br />        {<br />                 next=e-&gt;next;<br />             if(e-&gt;hash_code==hash &amp;&amp; !strcmp(key,e-&gt;key))<br />             {<br />                 tab-&gt;size--;<br />                          if(e==prev)<br />                              tab-&gt;array[ind]=next;<br />                           else<br />                              prev-&gt;next=next;<br />                          break;   <br />             }else{<br />                prev=e;<br />                e=next;        <br />             }        <br />        }<br />        if(e){<br />             if(tab-&gt;key_free_fp)tab-&gt;key_free_fp((char *)e-&gt;key);<br />             if(tab-&gt;value_free_fp)tab-&gt;value_free_fp((void *)e-&gt;value);        <br />             free(e);<br />             printf(&quot;free entry\n&quot;);<br />             return TRUE;<br />        }<br />        return FALSE;<br />}<br /><br />BOOL hash_data_clear(p_hashtable tab)<br />{<br />        p_hash_entry p;<br />        p_hash_entry q;<br />        int i=0;<br />        if(!tab)return FALSE;<br />        for(i=0;i&lt;tab-&gt;capacity;i++)<br />        {<br />                for(p=tab-&gt;array[i];p;p=q)<br />                {<br />                        q=p-&gt;next;<br />                 if(tab-&gt;key_free_fp)tab-&gt;key_free_fp((char*)p-&gt;key);<br />                     if(tab-&gt;value_free_fp)tab-&gt;value_free_fp((void*)p-&gt;value);<br />                free(p);<br />                printf(&quot;free hash entry \n&quot;);<br />                }<br />                tab-&gt;array[i]=0;<br />        }<br />        tab-&gt;size=0;<br />  return TRUE;        <br />}<br /><br />BOOL free_hashtab(p_hashtable tab)<br />{<br />    hash_data_clear(tab);<br />        free(tab-&gt;array);<br />        printf(&quot;free--hash-&gt;array.\n&quot;);<br />        tab-&gt;array=NULL;<br />        tab-&gt;capacity=0;<br />        free(tab);<br />        printf(&quot;free--hashtab.\n&quot;);<br />        tab=NULL;<br />  return TRUE;        <br />}<br /><br />void* hash_get(tab,key)<br />p_hashtable tab;<br />const char* key;<br />{<br />   p_hash_entry e;<br />   int hash;<br />   if(!tab||!key)return NULL;<br />   hash=tab-&gt;hash_code_fp(key);<br />   for(e=tab-&gt;array[HASH_IND(hash,tab-&gt;capacity)];e;e=e-&gt;next)<br />   {<br />              if(e-&gt;hash_code==hash&amp;&amp;!strcmp(e-&gt;key,key))<br />              {<br />                return ((void *)e-&gt;value);<br />              }<br />   }<br />   return NULL;        <br />}<br /><br />BOOL hash_put(p_hashtable tab,const char* key, const void* value){<br />        int hash ;<br />        int ind;<br />        p_hash_entry next_entry;<br />        p_hash_entry entry;<br />        if(!tab||!key||!value)return FALSE;<br />     hash = tab-&gt;hash_code_fp(key);<br />     ind = HASH_IND(hash,tab-&gt;capacity);<br />     next_entry=tab-&gt;array[ind];<br />     entry=new_entry();<br />     entry-&gt;hash_code=hash;<br />     entry-&gt;key=key;<br />     entry-&gt;value=value;<br />     entry-&gt;next=next_entry;<br />     entry-&gt;klen=strlen(key);<br />     tab-&gt;array[ind]=entry;<br />     tab-&gt;size++;<br />     if((tab-&gt;size*3/2)&gt;tab-&gt;capacity)<br />        hash_resize(tab);<br />   return TRUE;        <br />}<br /><br />BOOL hash_resize(p_hashtable tab){<br />        p_hash_entry* new_array;<br />        p_hash_entry entry,next;<br />        int new_capacity,i,ind;<br />        new_capacity=tab-&gt;capacity*2;<br />        new_array=(p_hash_entry*)calloc(new_capacity,sizeof(p_hash_entry));<br />        for(i=0;i&lt;tab-&gt;capacity;i++){<br />          if(entry=tab-&gt;array[i]){<br />                        do{<br />                                 tab-&gt;array[i]=0;<br />                                  next = entry-&gt;next;<br />                              ind=HASH_IND(entry-&gt;hash_code,new_capacity);<br />                              entry-&gt;next=new_array[ind];<br />                              new_array[ind]=entry;<br />                              entry=next;<br />                          }while(entry);<br />          }<br />        }<br />        free(tab-&gt;array);<br />        printf(&quot;resize free old array \n&quot;);<br />        printf(&quot;hash_resize to %d\n&quot;,new_capacity);<br />        tab-&gt;array=new_array;<br />        tab-&gt;capacity=new_capacity;<br /> return TRUE;        <br />}<br /><br />BOOL hash_contains_key(p_hashtable tab,  const char* key){<br />        if(!tab||!key)return FALSE;<br />   return (hash_get(tab,key)!=NULL);        <br />}<br /><br /><br />void hash_foreach_no_clear(p_hashtable tab,hash_foreach_fp fp){<br />        int i;<br />        if(!tab||!fp)return;<br />        for(i=0;i&lt;tab-&gt;capacity;i++)<br />        {<br />             if(tab-&gt;array[i])<br />              if(!fp(tab-&gt;array[i]))<br />                return;        <br />        }<br />}<br />void hash_foreach_clear(p_hashtable tab,hash_foreach_fp fp)<br />{<br />        p_hash_entry p;<br />        p_hash_entry q;<br />        int i=0;<br />        if(!tab||!fp)return;<br />        for(i=0;i&lt;tab-&gt;capacity;i++)<br />        {<br />                for(p=tab-&gt;array[i];p;p=q)<br />                {<br />                        q=p-&gt;next;<br />                        fp(p);<br />                 if(tab-&gt;key_free_fp)tab-&gt;key_free_fp((char*)p-&gt;key);<br />                     if(tab-&gt;value_free_fp)tab-&gt;value_free_fp((void*)p-&gt;value);<br />                free(p);<br />                printf(&quot;free hash entry \n&quot;);<br />                }<br />                tab-&gt;array[i]=0;<br />        }<br />        tab-&gt;size=0;<br />}<br /><br />unsigned int hash_code_fp_simple(const char* key){<br />  return 101;        <br />}<br /><br />BOOL hash_foreach_fp_simple(p_hash_entry e){<br />         printf(&quot;foreach : key=%s,value=%s\n&quot;,e-&gt;key,e-&gt;value);<br />  return TRUE;        <br />}<br />int main(){<br />        int i;<br />        char *key,*value;<br />        char key_buf[11];<br />     p_hashtable tab = new_hashtab();<br />     tab-&gt;key_free_fp=&amp;std_key_free;<br />     tab-&gt;value_free_fp=&amp;std_value_free;<br />     tab-&gt;hash_code_fp=&amp;hash_code_fp_default;<br />     for(i=0;i&lt;100;i++)<br />     {<br />         key=(char *)malloc(sizeof(char)*11);<br />         value=(char *)malloc(sizeof(char)*11);<br />         memset(key,0,11);<br />         memset(value,0,11);<br />         sprintf(key,&quot;key_%d&quot;,i);<br />         sprintf(value,&quot;val_%d&quot;,i);<br />         hash_put(tab,key,value);        <br />     }<br />    hash_foreach_no_clear(tab,&amp;hash_foreach_fp_simple);<br />    hash_remove_key(tab,&quot;key_2&quot;);<br />    for(i=10;i&lt;tab-&gt;size;i++)<br />     {<br />         memset(key_buf,0,11);<br />         sprintf(key_buf,&quot;key_%d&quot;,i);<br />         printf(&quot;get==&gt;key=%s,val=%s\n&quot;,key_buf,hash_get(tab,key_buf));        <br />     }<br />    hash_data_clear(tab);<br />    printf(&quot;hash.size : %d\n&quot;,tab-&gt;size);<br />    free_hashtab(tab);<br />        return 0;        <br />}<br /><br /><br /></div>]]></description>
</item><item>
<title>C trim replace函数</title>
<link>http://www.zhanglihai.com/b/rss2_6.xml/archives/2007/12/25/c_function_trim_replace.html</link>
<pubDate>Tue, 25 Dec 2007 17:11:30 +0800</pubDate>
<guid>http://www.zhanglihai.com/b/rss2_6.xml/archives/2007/12/25/c_function_trim_replace.html</guid>
<description><![CDATA[ <div class="ubbcode"><br />#include &lt;stdio.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;malloc.h&gt;<br />/*****************************<br /> * 去掉字符串两头的空格,\t,\r,\n字符<br /> * <br /> * 对输入的字符指针做修改<br /> * **************************/<br />char *trim(char *);<br />/******************************<br /> * 字符串替换<br /> * <br /> * 把原始字符串中的某个字符串换成另一个字符串同时<br /> * 把分配内存的指针指向输出字符串。<br /> * 返回 替换 的次数如果大于0，应该调用free()回收内存<br /> * ****************************/<br />int str_replace(char **,const char*,const char*,const char*);<br />char *trim(str)<br />char *str;<br />{<br /> char *s;<br /> char *e;<br /> if(str==NULL)return str;<br /> s=str;<br />//还是用到strlen了.<br /> e=&amp;str[strlen(str)-1];        <br /> for(;(*s==' '||*s=='\n'||*s=='\t'||*s=='\r');s++);<br /> for(;(*e==' '||*e=='\n'||*e=='\t'||*e=='\r');e--);<br /> e++;<br /> *e='\0';<br /> return s;        <br />}<br />int str_replace(outStr,source,oldStr,newStr)<br />char **outStr;<br />const char *source;<br />const char *oldStr;<br />const char *newStr;<br />{<br />        int s_len,o_len,n_len;<br />        char *p_str=NULL;<br />        char *p_tmp=NULL;<br />        char *p_out=NULL;<br />        int count=0;<br />        *outStr=NULL;<br />        if(source==NULL||oldStr==NULL||newStr==NULL)return 0;<br />        s_len=strlen(source);<br />        o_len=strlen(oldStr);<br />        n_len=strlen(newStr);<br />        //分配新以保证可以容纳替换后的新字符串<br />        p_out=(char *)malloc((s_len+(s_len/o_len)*(n_len)));<br />        if(NULL==p_out)<br />          return 0;<br />        //分配一个临时空间<br />        p_tmp=(char *)malloc(s_len);<br />        if(NULL==p_tmp)<br />        {<br />           if(p_out)<br />                   free(p_out);<br />          return 0;<br />        }<br />         memset(p_out,0,sizeof(p_out));<br />     while((p_str=strstr(source,oldStr)))<br />     {<br />             memset(p_tmp,0,s_len);<br />        strncpy(p_tmp,source,p_str-source);<br />        strcat(p_out,p_tmp);<br />        strcat(p_out,newStr);<br />        source=p_str+o_len;<br />        count++;<br />     }<br />     if(count==0){<br />       free(p_out);<br />       *outStr=NULL; <br />     }else{<br />       strcat(p_out,source);<br />       *outStr=p_out;<br />     }<br />    free(p_tmp);<br />   return count;        <br />}<br />int main()<br />{<br />        char str[51];<br />        char *ret_str;<br />        char *out_str;<br />        int ret=0;<br />        memset(str,0x0,sizeof(str));<br />        strcpy(str,&quot;\n \t  hello,world! &quot;) ;<br />        printf(&quot;str [%s]\n&quot;,str);<br />   ret_str=trim(str);<br />   printf(&quot;ret_str [%s]\n&quot;,ret_str);<br />   ret = str_replace(&amp;out_str,&quot;A$B$C$D$E$F$&quot;,&quot;$&quot;,&quot;[YOUKOUKAOKAOIII]&quot;);<br />   if(out_str)<br />   {<br />            printf(&quot;out_str : %s\n&quot;,out_str);<br />     free(out_str);<br />   }<br />   printf(&quot;Compiled on %s at %s\n&quot;,__DATE__,__TIME__);<br />   printf(&quot;Compiled file %s,line number : %d\n&quot;,__FILE__,__LINE__);<br />  return 0;        <br />}<br /></div>]]></description>
</item></channel>
</rss>