AVString字符串函数库详解
  1bTlX33AWdQ4 2023年11月02日 49 0

FFmpeg 是一个 C语言的项目,C语言标准库的功能比较简陋,所以很多东西都要自己写,造轮子。​​FFmpeg​​​ 已经造了不少轮子,​​AVString​​​ 就是其中一个轮子,用 ​​AVString​​ 函数库,可以使字符串处理更加方便。

​AVString​​ 函数库的代码在 ​​libavutil/avstring.h​​ 里面,本文选取一些常用的函数来讲解。

1,​av_strstart()​​,检查 ​​str​​ 字符串是不是以 ​​pfx​​ 开头的,如果是,返回 非 0,同时把 ​​ptr​​ 指向 ​​pfx​​ 后面的字符。

int av_strstart(const char *str, const char *pfx, const char **ptr);

2,​av_stristart()​​,跟 ​​av_strstart()​​ 一样,只是不区分大小写。

int av_stristart(const char *str, const char *pfx, const char **ptr);

上面这两个检查字符串开头的函数确实挺好用,C标准库好像是没有类似的函数。


3,​av_strnstr()​​,跟C标准库函数 ​​strstr()​​ 一样,只是限制了搜索长度。

char *av_strnstr(const char *haystack, const char *needle, size_t hay_length);

4,​av_strlcpy()​​,根据长度拷贝字符,跟 BSD 的 ​​strlcpy()​​ 函数一样。

size_t av_strlcpy(char *dst, const char *src, size_t size);

5,​av_strlcat()​​,拼接字符串函数,跟 BSD的 ​​strlcat()​​ 类似,但有些许区别。

size_t av_strlcat(char *dst, const char *src, size_t size);

6,​​av_strlcatf()​​,动态参数拼接字符串,感觉这个函数超有用。

size_t av_strlcatf(char *dst, size_t size, const char *fmt, ...) av_printf_format(3, 4);

7,​av_strnlen()​​,获取字符串的长度,但是加了长度限制,估计是为了防止传错指针,字符串没有以 0 结尾,导致死循环。加了长度限制就不会死循环。

static inline size_t av_strnlen(const char *s, size_t len)

8,​av_asprintf()​​,类似 GNU 的 ​​asprintf()​​ ,返回值是堆指针,需要自己释放内存。

char *av_asprintf(const char *fmt, ...) av_printf_format(1, 2);

9,​av_get_token()​​,不知道干嘛的,后面补充。

char *av_get_token(const char **buf, const char *term);

10,​av_strtok()​​,字符串分割函数,可以把 ​​hello-jason-please​​ 字符串按照 ​​-​​ 符号分割成 ​​hello​​ ​​jason​​ ​​please​​。

char *av_strtok(char *s, const char *delim, char **saveptr);

11,​av_isdigit()​​,判断单个字符是不是数字字符,通过把 ​​char​​ 转成 ​​int​​ 来比较的。

/**
* Locale-independent conversion of ASCII isdigit.
*/
static inline av_const int av_isdigit(int c){
return c >= '0' && c <= '9';
}

12,​av_isgraph()​​,判断单个字符是不是图像字符。

static inline av_const int av_isgraph(int c){
return c > 32 && c < 127;
}

13,​av_isspace()​​,判断单个字符是不是空格或者换行符之类的。

static inline av_const int av_isspace(int c)
{
return c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' ||
c == '\v';
}

14,​av_toupper()​​,​​av_tolower()​​,转换大小写。

15,​av_isxdigit()​​,判断一个字符是不是 16 进制的数字字符。

static inline av_const int av_isxdigit(int c)
{
c = av_tolower(c);
return av_isdigit(c) || (c >= 'a' && c <= 'f');
}

16,​av_strcasecmp()​​,比较两个字符串是否一样,不区分大小写。

int av_strcasecmp(const char *a, const char *b);
int av_strncasecmp(const char *a, const char *b, size_t n);

17,​av_strireplace()​​,后面补充。

18,​av_basename()​​,后面补充。线程安全的。

19,​av_dirname()​​,后面补充。线程安全的。

20,​av_match_name()​​,后面补充。

21,​av_append_path_component()​​,后面补充。

22,​av_escape()​​,后面补充。

23,​av_utf8_decode()​​,后面补充。

24,​av_match_list()​​,后面补充。

25,​av_sscanf()​​,后面补充。


还有一个我自己最常用的字符串函数,​​av_strdup()​​,但是这个函数是在 ​​libavutil/mem.h​​ 里面的,定义如下:

char *av_strdup(const char *s) av_malloc_attrib;

这个函数可以很方便的创建一个字符串变量,这个变量是在堆上的,需要自己释放内存。下面对比一下原生的方式跟 用 ​​av_strdup​​ 的方式。

char* name;
name = malloc(100);
strcpy(name,"loken-ffmpeg");
free(name);
--------------------
name = av_strdup("loken-ffmpeg");
av_freep(&name);

可以看到,​​av_strdup​​ 非常地简洁。


上面这些函数的使用示例,可以在 ​​GitHub​​ 下载,截图如下:

AVString字符串函数库详解_AVString

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  JDh7sMsPQI0Y   2023年11月13日   25   0   0 jsonSystem字符串
1bTlX33AWdQ4