嵌入式大杂烩周记 | 第 15 期

举报
嵌入式大杂烩 发表于 2022/08/26 22:39:33 2022/08/26
【摘要】 大家好,我是杂烩君。 嵌入式大杂烩周记主要是一些实用项目学习分享,每篇一个主题。 内容主要来源于我们之前收集的资料: https://gitee.com/zhengnianli/EmbedSummary 本期主角:sds SDS 是 C 的字符串库,旨在通过添加堆分配的字符串来增强有限的 libc 字符串处理功...

大家好,我是杂烩君。

嵌入式大杂烩周记主要是一些实用项目学习分享,每篇一个主题。

内容主要来源于我们之前收集的资料:

https://gitee.com/zhengnianli/EmbedSummary

本期主角:sds

SDS 是 C 的字符串库,旨在通过添加堆分配的字符串来增强有限的 libc 字符串处理功能。

SDS 字符串库特点:

(1)计算效率更高。获取字符串长度所需的复杂度从O(N)降低到了O(1),所以即使获取一个非常长的字符串长度,也不会对系统性能造成任何影响,因为该命令的时间复杂度仅为O(1)。

(2)二进制安全。SDS 字符串函数是二进制安全的,因此无论内容如何,长度都是字符串的真实长度,如果字符串中间包含空字符,也没有问题。而C字符串函数遇到空字符结束。

(3)SDS 字符串函数杜绝缓冲区溢出。

(4)SDS 字符串函数减少修改字符串时带来的内存重分配次数。

(5)SDS 字符串函数兼容部分C字符串函数。

sds源码链接:

https://github.com/antirez/sds

sds的使用

1、sds结构


   
  1. struct sds {
  2.     uint8_t len/* used */
  3.     uint8_t alloc; /* excluding the header and null terminator */
  4.     unsigned char flags; /* 3 lsb of type, 5 unused bits */
  5.     char buf[];
  6. };

用到了柔性数组,往期文章中也有用到柔性数组:

sds字符串记录自身的len信息,获取字符串的长度的时间复杂度仅为O(1)。C字符串不记录自身的len信息,所以为了获取字符串的长度只能遍历整个字符串,并对遍历的字符进行计数,直到遇到字符串结束符为止,时间复杂度仅为O(N)。

2、sds常用接口


   
  1. sds sdsnewlen(const void *init, size_t initlen);
  2. sds sdsnew(const char *init);
  3. sds sdsempty(void);
  4. sds sdsdup(const sds s);
  5. void sdsfree(sds s);
  6. sds sdsgrowzero(sds s, size_t len);
  7. sds sdscatlen(sds s, const void *t, size_t len);
  8. sds sdscat(sds s, const char *t);
  9. sds sdscatsds(sds s, const sds t);
  10. sds sdscpylen(sds s, const char *t, size_t len);
  11. sds sdscpy(sds s, const char *t);

(1)创建sds字符串


   
  1. int main(int argc, char **argv)
  2. {
  3.     sds mystring = sdsnew("Hello World!");
  4.     printf("%s\n", mystring);
  5.     sdsfree(mystring);
  6.     return 0;
  7. }
6535ebaa6b8a00ba74d45afc1102574c.png
  • sdsnew()SDS 字符串是通过函数或稍后我们将看到的其他类似函数创建和分配堆的。

  • SDS 字符串可以printf()像任何其他 C 字符串一样传递。

  • SDS 字符串需要用 释放sdsfree(),因为它们是堆分配的。

(2)复制sds字符串


   
  1. #include <stdio.h>
  2. #include "sds.h"
  3. #include "sdsalloc.h"
  4. int main(int argc, char **argv)
  5. {
  6.     sds src_str1 = sdsnew("Hello World!");
  7.     printf("src_str1 = %s\n", src_str1);
  8.     
  9.     sds dst_str1 = sdsempty();
  10.     dst_str1 = sdscpy(dst_str1, src_str1);
  11.     printf("dst_str1 = %s\n", dst_str1);
  12.     sdsfree(src_str1);
  13.     sdsfree(dst_str1);
  14.     return 0;
  15. }
abdb629fd13b03946f28b3852b9d1475.png
  • sdsempty()函数创建一个空的零长度字符串。

  • sdscpy()字符串拷贝函数,它不需要长度,但需要一个以空字符结尾的字符串。

(3)获取sds字符串长度


   
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include "sds.h"
  4. #include "sdsalloc.h"
  5. int main(int argc, char **argv)
  6. {
  7.     sds str = sdsnewlen("A\0\0B",4);
  8.     printf("sdslen(str) = %d\n", (int) sdslen(str));
  9.     printf("strlen(str) = %d\n", (int) strlen(str));
  10.     sdsfree(str);
  11.     return 0;
  12. }
cb18adfa6b3d30eb9070b651eef17de3.png
  • SDS 字符串函数是二进制安全的,因此无论内容如何,长度都是字符串的真实长度,如果字符串中间包含空字符,也没有问题。

  • strlen函数则遇到空字符则计算结束。

(4)连接sds字符串


   
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include "sds.h"
  4. #include "sdsalloc.h"
  5. int main(int argc, char **argv)
  6. {
  7.     sds str = sdsempty();
  8.     str = sdscat(str, "Hello ");
  9.     str = sdscat(str, "World!");
  10.     printf("%s\n", str);
  11.     sdsfree(str);
  12.     
  13.     return 0;
  14. }
aa089f051bcc870e156572d6cc1da70f.png

以上就是本次的分享。

如果觉得文章有帮助,麻烦帮忙点赞、收藏、转发,谢谢!

咱们下期见~

注意

由于微信公众号近期改变了推送规则,为了防止找不到,可以星标置顶,这样每次推送的文章才会出现在您的订阅列表里。

猜你喜欢:

分享一种灵活性很高的协议格式(附代码例子)

访问非法内存为什么不会出错?

嵌入式大杂烩周记 | 第 14 期

分享几个实用的代码片段(第二弹)

分享一种你可能不知道的bug定位方法

分享一种修改配置文件的方法

《嵌入式大杂烩周记第 13 期:lz4》

《嵌入式并行多线程处理器,了解一下!》

《分享一种修改配置文件的方法》

《分享几个实用的代码片段(附代码例子)》

《废旧板子再利用:搭建无线调试环境!》

《嵌入式段错误的3种调试方法汇总!》

《简说TCP通信非阻塞接收(附代码例子)》

《TCP通信常用接口的使用封装》

《写国际化的嵌入式代码,时间问题如何处理?》

《Linux命令行万能解压命令》

《嵌入式软件中,总线错误的坑?替大家先踩一步》

《分享嵌入式软件调试方法及几个有用的工具!》

《分享两点提高编程能力的建议!》

在公众号聊天界面回复1024,可获取嵌入式资源;回复 m ,可查看文章汇总

文章来源: blog.csdn.net,作者:嵌入式大杂烩,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/zhengnianli/article/details/126535352

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。