m*****n 发帖数: 3575 | 1 我司调用一个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*****n 发帖数: 3575 | 2 第三方库的h文件是这么写的:
virtual void RegisterIP(char *oneAddress) = 0;
我需要反复调用这个函数,把任意多个IP地址给注册上。
这样即使断线了,第三方库会自动尝试别的IP地址进行重连。 |
r******r 发帖数: 309 | 3 ch[0] = new char [a.size()];
得分配地址。
语法可能有错。就是动态分配地址。 |
b***i 发帖数: 3043 | 4 这个接口不专业,应该加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*****n 的大作中提到】 : 第三方库的h文件是这么写的: : virtual void RegisterIP(char *oneAddress) = 0; : 我需要反复调用这个函数,把任意多个IP地址给注册上。 : 这样即使断线了,第三方库会自动尝试别的IP地址进行重连。
|
c**u 发帖数: 14 | 5 你要搞清楚他们会对这个字符串做什么, 会改动吗?会 auto release 吗? 大概率不
会, 是只读的, 好多 C 的程序都是这样的, 那样的话 可以用 c_str() cast 一下
就好了。 |
m*1 发帖数: 1 | 6 看起来这个接口的input是一个以零结尾的c string。你把字串拷贝到array中去后,要
保证字串后跟着0。
这是很基本的c语言常识。 |
e****l 发帖数: 3319 | 7 看上去不需要100个地址指针char* ch[100],只要一个,然后循环,循环每步像上面说
的那样,动态分配内存,用完delete掉,下一步重新分配,如此下去 |
a***n 发帖数: 538 | 8 用 const_cast(s.data()) 应该可以吧。但是要保证这个s一直存在。 |
t**8 发帖数: 4527 | 9 不知道你想说啥
C 里面 可任意动态生成字符串
你这个 接口不就是长度不限的字符串吗, 结尾为 null
有啥特别的地方
看起来 C++ 就是脱裤子放屁, 多此一举
忘掉 string
直接用 char* 写程序
【在 m*****n 的大作中提到】 : 第三方库的h文件是这么写的: : virtual void RegisterIP(char *oneAddress) = 0; : 我需要反复调用这个函数,把任意多个IP地址给注册上。 : 这样即使断线了,第三方库会自动尝试别的IP地址进行重连。
|
m*****n 发帖数: 3575 | 10 谢谢,我去试试。
【在 b***i 的大作中提到】 : 这个接口不专业,应该加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*****n 发帖数: 3575 | 11 别人教我这么写:
RegisterIP(&a[0]);
这样就完成a的类型转换,这么做和你的方法的区别在什么?
【在 b***i 的大作中提到】 : 这个接口不专业,应该加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***i 发帖数: 3043 | 12 这个方法简单,确定是C++11的。因为之前不保证字符存储是连续的。
我的方法就是你写的方法的正确写法,但是需要copy。这个方法不需要copy。
另一个写法是
RegisterIP(&a.front());
【在 m*****n 的大作中提到】 : 别人教我这么写: : RegisterIP(&a[0]); : 这样就完成a的类型转换,这么做和你的方法的区别在什么?
|
s*****k 发帖数: 604 | 13 你和你的程序员都很菜
【在 m*****n 的大作中提到】 : 我司调用一个C++的金融接口,规定可以绑定多IP地址,但每个都必须是char*类型。程 : 序员告诉我说做不了。我自己试了试,好像还真不好做。 : 简化版:把一个句子中每个单词都保存为单独的char*变量。 : 最简单的: : char* w1 = "Hello".data() : 第三方函数(w1) : char* w2 = "World".data() : 第三方函数(w2) : 以上代码的问题很明显,w1和w2是手动命名的,多个地址可未必是2个或者固定个,应 : 该在配置里可以改动。由于C++不支持自己拼接变量名,只能通过vector或array进行迂
|
m*****n 发帖数: 3575 | 14 我本来就不是程序员。
然而我的程序员仗着自己是学这个的,经常冲我拍桌子。
【在 s*****k 的大作中提到】 : 你和你的程序员都很菜
|
b***i 发帖数: 3043 | 15 教你这个写法的是同一个吗?
RegisterIP(&a[0]);
【在 m*****n 的大作中提到】 : 我本来就不是程序员。 : 然而我的程序员仗着自己是学这个的,经常冲我拍桌子。
|
m*****n 发帖数: 3575 | 16 不是,这个是stackoverflow上的美帝程序员,东欧裔
【在 b***i 的大作中提到】 : 教你这个写法的是同一个吗? : RegisterIP(&a[0]);
|