2714|2

7815

帖子

57

TA的资源

裸片初长成(中级)

楼主
 

【靠谱例程联盟】20131218 C风格字符串处理模块 [复制链接]

20131218 C风格字符串处理模块
       这是顺着之前那个 malloc/realloc 内存在函数之间传递 的 帖子的后续。
       采用了重新封装一个结构体,虽然相较于 C++,必须自己调用 在地位上 类似于 Cpp类的 构造函数 和 析构函数。除此以外,它还是比较方便的。当前只实现了一个 Append功能——也就是连接字符串。但过后会一点点补充完整。
       并不能保证它和c++的string类完全等价——毕竟我对这个类的理解也不全面,我只能说我会把平素需要用到的功能都做出来。
       沙发贴是源码.
此帖出自编程基础论坛
点赞 关注(1)
 

回复
举报

7815

帖子

57

TA的资源

裸片初长成(中级)

沙发
 
  1. // 头文件
  2. #ifndef _CSTYLE_STRING_
  3. #define _CSTYLE_STRING_

  4.     #define AVAILABLE     1
  5.     #define NOT_AVAILABLE 0
  6.    
  7.     typedef int CSS_Flag;

  8.     struct uCStyleString
  9.     {
  10.             char *buff;
  11.             CSS_Flag isAvailable;
  12.             int (*Append)(struct uCStyleString *Str,char *sub);
  13.             void (*Destroy)(struct uCStyleString *Str);
  14.     };
  15.    
  16.     typedef struct uCStyleString CStyleString;
  17.    
  18.     void CStyleStringSet(CStyleString *Str);
  19.    
  20.    

  21. #endif

  22. // end of file -------------------------------------
复制代码
  1. // 源文件
  2. #include "CStyleString.h"
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <stdio.h>

  6. static void CStyleStringCreate(CStyleString *Str,char *InitialString)
  7. {
  8.        if(Str->buff == NULL)
  9.           Str->buff = (char *)malloc(sizeof(char) * (strlen(InitialString) + 1) );
  10.           
  11.           
  12.            if(Str->buff == NULL)   
  13.               Str->isAvailable = NOT_AVAILABLE;
  14.            else
  15.            {
  16.               Str->isAvailable = AVAILABLE;
  17.               strcpy(Str->buff,InitialString);
  18.        }
  19. }

  20. static void CStyleStringDestroy(CStyleString *Str)
  21. {
  22.     if(Str->buff != NULL)
  23.     {
  24.         free(Str->buff);
  25.         Str->buff = NULL;
  26.     }
  27. }

  28. static int CStyleStringCatch(CStyleString *Str,char *sub)
  29. {
  30.         char *buff = NULL;
  31.        
  32.     if(Str == NULL || sub == NULL) return -1;
  33.    
  34.     if(Str->buff == NULL)
  35.                 CStyleStringCreate(Str,sub);
  36.         else
  37.         {
  38.                 if(Str->isAvailable == NOT_AVAILABLE) return -1;
  39.        
  40.                 buff = Str->buff;

  41.                 Str->buff = (char *)malloc(sizeof(char) * (strlen(Str->buff) + strlen(sub) + 1) );
  42.                 if(Str->buff == NULL)
  43.                 {
  44.                     Str->isAvailable = NOT_AVAILABLE;
  45.                     strcpy(Str->buff,buff); // 在分配出错时,确保原数据可以恢复;
  46.                 }
  47.                 else
  48.                 {
  49.                 strcpy(Str->buff,buff);
  50.                     strcat(Str->buff,sub);
  51.                     Str->buff[strlen(buff) + strlen(sub)] = 0;  
  52.             }
  53.         }
  54.    
  55.         free(buff); buff = NULL;
  56.        
  57.         return 0;
  58. }

  59. //---------------------

  60. void CStyleStringSet(CStyleString *Str)
  61. {
  62.          Str->buff = NULL;
  63.          Str->isAvailable = NOT_AVAILABLE;
  64.          Str->Append = CStyleStringCatch;
  65.          Str->Destroy = CStyleStringDestroy;
  66. }








  67. // end of file -----------------------------------------------

复制代码
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

板凳
 

作为一个粗糙的使用例程

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. #include "CStyleString.h"

  4. int main(void)
  5. {
  6.         CStyleString TestStr;       
  7.         CStyleStringSet(&TestStr);
  8.        
  9.         (*TestStr.Append)(&TestStr,"I want it that way.");
  10.         (*TestStr.Append)(&TestStr,"I said it that way.");
  11.     (*TestStr.Append)(&TestStr,"\nso,I get it,append function!.");
  12.         printf("we have string \n%s\n",TestStr.buff);
  13.        
  14.         (*TestStr.Destroy)(&TestStr);
  15.        
  16.         return 0;
  17. }

  18. // end of file --------------------------------------------------------------

复制代码
此帖出自编程基础论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表