描述 一个服务配置文件是文本的,包含多个子服务配置。每个配置项由“;”号间隔。配置项第一个点前是子服务名称,请把配置项按不同子服务分别解析打印出来。不同配置项以换行\r\n分开。要求考虑配置项中可能存在不合法的配置,比如配置主键或者值没有写,要考虑过滤掉不合法的配置项,具有容错性。 输入描述 比如下面配置: service1.host=192.168.1.1;service1.port=8080;service2.host=192.168.1.2;service2.port=8081; 这里包含两个子服务service1和service2,使用C++实现,不使用正则表达式
时间: 2024-02-17 14:05:34 浏览: 56
以下是C++实现的代码,使用了字符串的基本操作和STL容器unordered_map,具有容错性:
```c++
#include <iostream>
#include <string>
#include <unordered_map>
int main() {
std::string config = "service1.host=192.168.1.1;service1.port=8080;service2.host=192.168.1.2;service2.port=8081;";
std::unordered_map<std::string, std::unordered_map<std::string, std::string>> service_configs;
// 拆分配置项
size_t pos = 0;
while (pos < config.size()) {
// 查找下一个配置项
size_t next_pos = config.find(';', pos);
if (next_pos == std::string::npos) {
next_pos = config.size();
}
// 获取当前配置项
std::string config_item = config.substr(pos, next_pos - pos);
// 查找子服务名称和配置项名称
size_t dot_pos = config_item.find('.');
size_t equal_pos = config_item.find('=');
if (dot_pos != std::string::npos && equal_pos != std::string::npos && dot_pos < equal_pos) {
// 获取子服务名称,配置项名称和配置项值
std::string service_name = config_item.substr(0, dot_pos);
std::string config_name = config_item.substr(dot_pos + 1, equal_pos - dot_pos - 1);
std::string config_value = config_item.substr(equal_pos + 1);
// 判断子服务是否已存在,不存在则创建
if (service_configs.find(service_name) == service_configs.end()) {
service_configs[service_name] = std::unordered_map<std::string, std::string>();
}
// 添加配置项
service_configs[service_name][config_name] = config_value;
}
// 更新查找位置
pos = next_pos + 1;
}
// 输出结果
for (const auto& [service_name, service_config] : service_configs) {
std::cout << service_name << ":\r\n";
for (const auto& [config_name, config_value] : service_config) {
std::cout << "\t" << config_name << " = " << config_value << "\r\n";
}
}
return 0;
}
```
输出结果为:
```
service1:
host = 192.168.1.1
port = 8080
service2:
host = 192.168.1.2
port = 8081
```
阅读全文