字符串分割是在程序编写过程中经常需要做的事情,如,将字符串:hello world, you are welcome!,进行单词分割,结果希望得到5个单词:hello, world, you, are, welcome。使用 ACL_ARGV 函数便可以非常轻松地实现此功能,如下:
// 分割字符串,分割符为 ' ', '\t', ',', '!'
ACL_ARGV *argv = acl_argv_split("hello world, you are welcome!", " \t,!");
ACL_ITER iter; // 遍历指针
// 遍历分割后的结果
acl_foreach(iter, argv) {
// 从遍历指针中取出字符串型数据
const char *ptr = (const char*) iter.data;
// 打印单词
printf(">>>%s\n", ptr);
}
// 释放内存
acl_argv_free(argv);
由此可见使用ACL_ARGV函数分割字符串是如此简单。此外,因为 ACL_ARGV 结构定义符合 ACL_ITER 规范(参见C语言中迭代器的设计与使用 ),所以可以直接以 acl_foreach() {} 方式进行遍历。
该例子用到了 lib_acl/include/acl_argv.h 中的两个函数接口,如下:
/**
* 根据源字符串及分隔字符串生成一个字符串动态数组
* @param str {const char*} 源字符串
* @param delim {const char*} 分隔字符串
* @return {ACL_ARGV*}
*/
ACL_API ACL_ARGV *acl_argv_split(const char *str, const char *delim);
/**
* 释放字符串动态数组
* @param argvp {ACL_ARGV*} 字符串动态数组指针
*/
ACL_API ACL_ARGV *acl_argv_free(ACL_ARGV *argvp);
此外,acl_argv.h 中还提供了其它方便使用的函数接口,如:
/**
* 向字符串动态数组中添加一至多个字符串,最后一个NULL字符串表示结束
* @param argvp {ACL_ARGV*} 字符串动态数组指针
* @param ... 字符串列表,最后一个为NULL, 格式如:{s1}, {s2}, ..., NULL
*/
ACL_API void acl_argv_add(ACL_ARGV *argvp,...);
/**
* 向字符串动态数组中添加字段长度有限制的字符串列表
* @param argvp {ACL_ARGV*} 字符串动态数组指针
* @param ... 一组有长度限制的字符串列表,如: {s1}, {len1}, {s2}, {len2}, ... NULL
*/
ACL_API void acl_argv_addn(ACL_ARGV *argvp,...);
/**
* 根据源字符串及分隔字符串生成一个字符串动态数组, 但限定最大分隔次数
* @param str {const char*} 源字符串
* @param delim {const char*} 分隔字符串
* @param n {size_t} 最大分隔次数
* @return {ACL_ARGV*}
*/
ACL_API ACL_ARGV *acl_argv_splitn(const char *str, const char *delim, size_t n);
/**
* 源字符串经分隔符分解后,其结果被附加至一个字符串动态数组
* @param argvp {ACL_ARGV*} 字符串动态数组指针
* @param str {const char*} 源字符串
* @param delim {const char*} 分隔字符串
* @return {ACL_ARGV*}
*/
ACL_API ACL_ARGV *acl_argv_split_append(ACL_ARGV *argvp, const char *str, const char *delim);
这些函数提供了在对字符串进行分割组合时的操作功能。
ACL 库下载位置:http://acl.sourceforge.net/
本文介绍如何利用lib_acl库中的ACL_ARGV函数轻松实现字符串分割操作,并提供多个实用函数接口,便于开发者灵活处理字符串数据。
428

被折叠的 条评论
为什么被折叠?



