收藏官网首页
查看: 16020|回复: 2

C标准库没提供的助手函数:字符串替换

跳转到指定楼层
楼主
发表于 2015-12-18 02:41:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
汉枫LPB120模块
  1. /**************** (C) COPYRIGHT 2015 Gizwits *******************
  2. * @file              : strrpl.c
  3. * @author            : William Yip
  4. * @date              : 18 Dec 2015
  5. * @version           : 1.0
  6. * @brief             : 连接、增值、开放、中立、安全、自有、自由、生态
  7. ******************************************************
  8. * History:
  9. ******************************************************
  10. THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH
  11. CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. AS A
  12. RESULT, GIZWITS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, INDIRECT OR
  13. CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT OF
  14. SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION
  15. CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  16. *****************************************************/

  17. #include "strrpl.h"

  18. #ifdef GIZWITS_STRRPL_EXAMPLE
  19. void main()
  20. {
  21.         char * json = "{\"data\":[{\"product_key\":\"14ea605e1b7b43228494400e340fc7bb\",\"device_sn\":\"accf23796032\",\"uid\":\"3b2a09ea7a14430ba7938ddb93140a2e\",\"ts\":1450349681,\"attrs\":{\"Down\":false,\"Right\":false,\"speed\":\"0\",\"Up\":false,\"Left\":false}}]}";
  22.         char * token = "\"";
  23.         char * replacement = "\\\"";
  24.         char * result = strrpl(json, token, replacement);
  25.         printf("\n%s\n\n", result);
  26.         free(result);
  27. }
  28. #endif // GIZWITS_STRRPL_EXAMPLE

  29. char * strrpl(const char * str, const char * token, const char * replacement)
  30. {
  31.         int lenToken = strlen(token);
  32.         int lenReplacement = strlen(replacement);
  33.         int lenResult = 0;

  34.         char * begin = NULL;
  35.         char * end = NULL;
  36.         int count = 0;

  37.         char * output = NULL;
  38.         char * tmp = NULL;
  39.         int len = 0;

  40.         int i = 0;

  41.         // 输入检查:防止参数空指针
  42.         if (!str || !token || !replacement)
  43.         {
  44.                 fprintf(stderr, "%s(), NULL parameter is not allowed", __func__);
  45.                 return NULL;
  46.         }

  47.         // 先搜一遍:找有多少个可替换先
  48.         end = begin = (char *) str;
  49.         count = 0;
  50.         for ( end = strstr(str, "\"");
  51.                 NULL != end;
  52.                 end = strstr(begin, "\"") )
  53.         {
  54.                 count++;
  55.                 begin = end + lenToken;
  56.         }

  57.         // 预分配替换后的目标字符串缓冲
  58.         lenResult = strlen(str) + count * (lenReplacement - lenToken) + 1;
  59.         output = malloc(lenResult);

  60.         // 真正进行替换
  61.         end = begin = (char *) str;
  62.         tmp = output;
  63.         for ( end = strstr(str, "\"");
  64.                 NULL != end;
  65.                 end = strstr(begin, "\"") )
  66.         {
  67.                 len = end - begin;
  68.                 memcpy(tmp, begin, len); tmp += len;
  69.                 // 目标字符串,游标移位
  70.                 for (i=0; i<lenReplacement; i++)
  71.                 {
  72.                         *tmp = replacement[i];
  73.                         tmp++;
  74.                 }
  75.                 // 源字符串,游标移位
  76.                 begin = end + lenToken;
  77.         }

  78.         // 最后一个替换后剩余的结尾(或者没有替换可进行时,就直接拷贝整个源字符串)
  79.         len = strlen(str) - (begin - str);
  80.         if (len > 0)
  81.                 memcpy(tmp, begin, len);

  82.         // 目标字符串加终止符,确保不越界
  83.         output[lenResult - 1] = '\0';

  84.         return output;
  85. }
复制代码

沙发
 楼主| 发表于 2015-12-18 02:41:44 | 只看该作者
  1. /*********** (C) COPYRIGHT 2015 Gizwits *************
  2. * @file              : strrpl.h
  3. * @author            : William Yip
  4. * @date              : 18 Dec 2015
  5. * @version           : 1.0
  6. * @brief             : 连接、增值、开放、中立、安全、自有、自由、生态
  7. ************************************
  8. * History:
  9. ************************************
  10. THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH
  11. CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. AS A
  12. RESULT, GIZWITS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, INDIRECT OR
  13. CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT OF
  14. SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION
  15. CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  16. ************************************/

  17. #ifndef _GIZWITS_STRRPL_H_
  18. #define _GIZWITS_STRRPL_H_

  19. #include <string.h>
  20. #include <stdlib.h>
  21. #include <stdio.h>

  22. // #define GIZWITS_STRRPL_EXAMPLE

  23. /**
  24. * @desc C助手函数,字符串替换
  25. * @param str 源字符串
  26. * @param token 将被替换的内容
  27. * @param replacement 要替换成的新内容
  28. * @memo 如果想运行示例,打开GIZWITS_STRRPL_EXAMPLE预定义开关进行编译,具体示例代码在main() @ strrpl.cpp中
  29. */
  30. char * strrpl(const char * str, const char * token, const char * replacement);

  31. #endif // _GIZWITS_STRRPL_H_
复制代码

140

主题

418

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
12631
板凳
发表于 2015-12-23 11:37:35 | 只看该作者
看上去很不错哦~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表