[英]How to assign char* variables dynamicly in C++?
我遇到在程序中将任意地址注册为char*
的场景。我需要将每个地址作为 char char*
传递给第三方库以进行进一步操作。
third_party_function 在其 header 文件中如此描述:
virtual void RegisterFront(char *pszFrontAddress) = 0;
首先,程序必须从具有一组地址的配置文件中读取,例如:
tcp://18.19.20.22:7778; tcp://18.19.20.24:7778; tcp://18.19.20.25:7778;
如果我将其定义为 cstring 并使用循环,则分析此字符串并将其分解为地址向量的过程很简单。 但是每个都必须在 function 中注册,以便在当前失败时库连接到另一个地址。 目前配置有 3 个地址,但应该允许任意数量的地址。
分配char*
变量的 static 方法如下:
...
#include third_party_lib;
char* addr1 = "tcp://18.19.20.22:7778".c_str();
char* addr2 = "tcp://18.19.20.24:7778".c_str();
RegisterFront(addr1);
RegisterFront(addr2);
我省略了从配置中分析地址的循环,但本质很清楚:我无法在程序中命名 addr[n],因为地址的数量是不确定的 - 这取决于该配置中将写入多少个线。
即对于 3 地址方案,我可以在代码中分配addr1
addr2
addr3
。 但是一旦编译完成,如果配置行现在只包含两个地址怎么办? 改成5怎么办?
char*
变量并将每个变量传递给第三方 function RegisterFront
? - 当然你可以用一些 print function 来替换它来试试,但是输入类型应该是一样的。假设您的配置行是这样的:
std::string s = "tcp://18.19.20.22:7778; tcp://18.19.20.24:7778; tcp://18.19.20.25:7778;"
s
也可以是 char*,没关系。 在您的代码中的某个时刻,您已经获得了从文件或任何地方读取的该配置行的字符串表示形式。
然后循环遍历每个 URL 和所有RegisterFront
function 的字符串就是这样。
void trim(std::string& str) {
while (s.size() > 0 && isspace(s[0])) {
s = s.substr(1);
}
while (s.size() > 0) && isspace(s[s.size()-1]) {
s = s.substr(0, s.size()-1);
}
}
void RegisterAddresses(const std::string& config_line) {
std::istringstream ss(config_line);
std::string address;
while (std::getline(ss, address, ";")) {
trim(address);
char* data = address.data();
RegisterFront(data);
}
}
然后,当您拥有 config_line (定义为char*
或std::string
实例)时,您只需以任何一种方式调用它:
std::string s = "tcp://18.19.20.22:7778; tcp://18.19.20.24:7778; tcp://18.19.20.25:7778;"
RegisterAddresses(s);
这也有效(一个临时的 std::string 被传递给 RegisterAddresses - 从传入的 char* 构造)
const char* s = "tcp://18.19.20.22:7778; tcp://18.19.20.24:7778; tcp://18.19.20.25:7778;"
RegisterAddresses(s);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.