如何在libconfig中根据后缀4位数字查找对应配置对象?
解决方案
libconfig本身没有内置的通配符查找API,要实现你需要的模糊匹配,只能手动遍历Services组下的所有子项,通过字符串匹配筛选出后缀符合目标四位数字的key。具体步骤如下:
- 首先定位到
Services配置组,确认它是合法的组类型配置项 - 遍历该组下的所有子配置项,逐个获取子项的key名称
- 对每个key进行后缀匹配,检查是否以
_XXXX(XXXX为你已知的四位数字)结尾 - 由于四位数字是唯一标识符,找到第一个匹配项即可停止遍历
以下是C语言的实现示例:
#include <libconfig.h> #include <string.h> #include <stdio.h> const char* find_service_by_suffix(config_t *cfg, const char *target_suffix) { // 获取Services配置组 config_setting_t *services = config_lookup(cfg, "Services"); if (!services || !config_setting_is_group(services)) { fprintf(stderr, "Services配置项不存在或不是组类型\n"); return NULL; } size_t suffix_len = strlen(target_suffix); int num_settings = config_setting_length(services); // 遍历所有子项 for (int i = 0; i < num_settings; i++) { config_setting_t *setting = config_setting_get_elem(services, i); const char *key = config_setting_name(setting); size_t key_len = strlen(key); // 跳过长度不足的key,避免越界 if (key_len < suffix_len) { continue; } // 检查后缀是否匹配 if (strcmp(key + key_len - suffix_len, target_suffix) == 0) { return key; // 返回匹配到的key } } fprintf(stderr, "未找到后缀为%s的服务项\n", target_suffix); return NULL; } // 使用示例 int main() { config_t cfg; config_init(&cfg); // 加载配置文件 if (!config_read_file(&cfg, "your_config.cfg")) { fprintf(stderr, "%s:%d - %s\n", config_error_file(&cfg), config_error_line(&cfg), config_error_text(&cfg)); config_destroy(&cfg); return 1; } // 查找后缀为_2222的服务key const char *matched_key = find_service_by_suffix(&cfg, "_2222"); if (matched_key) { printf("匹配到的服务key: %s\n", matched_key); // 可进一步通过matched_key获取对应的配置对象 config_setting_t *service = config_lookup(&cfg, matched_key); // ... 后续处理配置 } config_destroy(&cfg); return 0; }
注意事项:
- 确保传入的
target_suffix是_XXXX格式(包含下划线和四位数字),避免匹配错误 - 因为四位数字是唯一的,遍历到第一个匹配项就返回,提升效率
- 字符串匹配时要先检查key长度,防止
key + key_len - suffix_len出现越界访问
内容的提问来源于stack exchange,提问作者LearningC
相关产品推荐
相关产品推荐

