繁体   English   中英

如何在 C++ 中动态分配 char* 变量?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM