C++能实现动态存储char*吗?

m
minquan
楼主 (未名空间)


我司调用一个C++的金融接口,规定可以绑定多IP地址,但每个都必须是char*类型。程序员告诉我说做不了。我自己试了试,好像还真不好做。

简化版:把一个句子中每个单词都保存为单独的char*变量。

最简单的:

char* w1 = "Hello".data()
第三方函数(w1)
char* w2 = "World".data()
第三方函数(w2)

以上代码的问题很明显,w1和w2是手动命名的,多个地址可未必是2个或者固定个,应
该在配置里可以改动。由于C++不支持自己拼接变量名,只能通过vector或array进行迂回:

#include
#include
#include
using namespace std;

int main()
{
char* ch[100];
string a = "Hello";

a.copy(ch[0], a.size(), 0);
cout << "ch[0]: "< //第三方函数(ch[0]);

a = "World";
cout << "a after: " <
a.copy(ch[1], a.size(), 0);
cout << "ch[1]: "<< ch[1] < //第三方函数(ch[1]);
}

里面的a就概括了我把配置"Hello World"拆分开的过程,实际会在loop中完成,因此假设复用一个变量名。理论上ch可以装1~100个地址,之后可以把每个地址ch[n]用接口给的函数给注册上。但是这段代码显然是错了

ch[0]: Hello
a after: World

m
minquan

第三方库的h文件是这么写的:

virtual void RegisterIP(char *oneAddress) = 0;

我需要反复调用这个函数,把任意多个IP地址给注册上。
这样即使断线了,第三方库会自动尝试别的IP地址进行重连。
r
radiator

ch[0] = new char [a.size()];

得分配地址。

语法可能有错。就是动态分配地址。

b
bihai

这个接口不专业,应该加const

const char* oneAddress

使用的时候,

char* ch[100];
然后
ch[0] = new char[a.size()+1]; // 最后要多一个0
a.copy(ch[0], a.size());
ch[0][a.size()]=0;
RegisterIP(ch[0]);

就因为这个接口不专业,导致不能使用RegisterIP(a.c_str());

【 在 minquan (三民主义) 的大作中提到: 】
: 第三方库的h文件是这么写的:
: virtual void RegisterIP(char *oneAddress) = 0;
: 我需要反复调用这个函数,把任意多个IP地址给注册上。
: 这样即使断线了,第三方库会自动尝试别的IP地址进行重连。

c
cimu

你要搞清楚他们会对这个字符串做什么, 会改动吗?会 auto release 吗? 大概率不会, 是只读的, 好多 C 的程序都是这样的, 那样的话 可以用 c_str() cast 一下
就好了。
m
mb1

看起来这个接口的input是一个以零结尾的c string。你把字串拷贝到array中去后,要保证字串后跟着0。
这是很基本的c语言常识。
e
entdel

看上去不需要100个地址指针char* ch[100],只要一个,然后循环,循环每步像上面说的那样,动态分配内存,用完delete掉,下一步重新分配,如此下去
a
aaron

用 const_cast(s.data()) 应该可以吧。但是要保证这个s一直存在。
t
ts78

不知道你想说啥

C 里面 可任意动态生成字符串

你这个 接口不就是长度不限的字符串吗, 结尾为 null
有啥特别的地方

看起来 C++ 就是脱裤子放屁, 多此一举

忘掉 string
直接用 char* 写程序

【 在 minquan (三民主义) 的大作中提到: 】
: 第三方库的h文件是这么写的:
: virtual void RegisterIP(char *oneAddress) = 0;
: 我需要反复调用这个函数,把任意多个IP地址给注册上。
: 这样即使断线了,第三方库会自动尝试别的IP地址进行重连。

m
minquan

谢谢,我去试试。

【 在 bihai (学得不好) 的大作中提到: 】
: 这个接口不专业,应该加const
: const char* oneAddress
: 使用的时候,
: char* ch[100];
: 然后
: ch[0] = new char[a.size()+1]; // 最后要多一个0
: a.copy(ch[0], a.size());
: ch[0][a.size()]=0;
: RegisterIP(ch[0]);
: 就因为这个接口不专业,导致不能使用RegisterIP(a.c_str());

m
minquan

别人教我这么写:

RegisterIP(&a[0]);

这样就完成a的类型转换,这么做和你的方法的区别在什么?

【 在 bihai (学得不好) 的大作中提到: 】
: 这个接口不专业,应该加const
: const char* oneAddress
: 使用的时候,
: char* ch[100];
: 然后
: ch[0] = new char[a.size()+1]; // 最后要多一个0
: a.copy(ch[0], a.size());
: ch[0][a.size()]=0;
: RegisterIP(ch[0]);
: 就因为这个接口不专业,导致不能使用RegisterIP(a.c_str());

b
bihai

这个方法简单,确定是C++11的。因为之前不保证字符存储是连续的。

我的方法就是你写的方法的正确写法,但是需要copy。这个方法不需要copy。

另一个写法是
RegisterIP(&a.front());

【 在 minquan (三民主义) 的大作中提到: 】
: 别人教我这么写:
: RegisterIP(&a[0]);
: 这样就完成a的类型转换,这么做和你的方法的区别在什么?

s
sixpack

你和你的程序员都很菜
【 在 minquan (三民主义) 的大作中提到: 】
: 我司调用一个C++的金融接口,规定可以绑定多IP地址,但每个都必须是char*类型。程
: 序员告诉我说做不了。我自己试了试,好像还真不好做。
: 简化版:把一个句子中每个单词都保存为单独的char*变量。
: 最简单的:
: char* w1 = "Hello".data()
: 第三方函数(w1)
: char* w2 = "World".data()
: 第三方函数(w2)
: 以上代码的问题很明显,w1和w2是手动命名的,多个地址可未必是2个或者固定个,应
: 该在配置里可以改动。由于C++不支持自己拼接变量名,只能通过vector或array进行迂
: ...................

m
minquan

我本来就不是程序员。

然而我的程序员仗着自己是学这个的,经常冲我拍桌子。

【 在 sixpack (InGodWeTrustAllOthersWeMonitor) 的大作中提到: 】
: 你和你的程序员都很菜

b
bihai

教你这个写法的是同一个吗?

RegisterIP(&a[0]);

【 在 minquan (三民主义) 的大作中提到: 】
: 我本来就不是程序员。
: 然而我的程序员仗着自己是学这个的,经常冲我拍桌子。