看帖神器
未名空间
追帖动态
头条新闻
每日新帖
最新热帖
新闻存档
热帖存档
文学城
虎扑论坛
未名空间
北美华人网
北美微论坛
看帖神器
登录
← 下载
《看帖神器》官方
iOS App
,体验轻松追帖。
C++能实现动态存储char*吗?
查看未名空间今日新帖
最新回复:2022年1月5日 20点31分 PT
共 (15) 楼
返回列表
订阅追帖
只看未读
更多选项
阅读全帖
只看图片
只看视频
查看原帖
m
minquan
接近 3 年
楼主 (未名空间)
我司调用一个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
接近 3 年
2 楼
第三方库的h文件是这么写的:
virtual void RegisterIP(char *oneAddress) = 0;
我需要反复调用这个函数,把任意多个IP地址给注册上。
这样即使断线了,第三方库会自动尝试别的IP地址进行重连。
r
radiator
接近 3 年
3 楼
ch[0] = new char [a.size()];
得分配地址。
语法可能有错。就是动态分配地址。
b
bihai
接近 3 年
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());
【 在 minquan (三民主义) 的大作中提到: 】
: 第三方库的h文件是这么写的:
: virtual void RegisterIP(char *oneAddress) = 0;
: 我需要反复调用这个函数,把任意多个IP地址给注册上。
: 这样即使断线了,第三方库会自动尝试别的IP地址进行重连。
c
cimu
接近 3 年
5 楼
你要搞清楚他们会对这个字符串做什么, 会改动吗?会 auto release 吗? 大概率不会, 是只读的, 好多 C 的程序都是这样的, 那样的话 可以用 c_str() cast 一下
就好了。
m
mb1
接近 3 年
6 楼
看起来这个接口的input是一个以零结尾的c string。你把字串拷贝到array中去后,要保证字串后跟着0。
这是很基本的c语言常识。
e
entdel
接近 3 年
7 楼
看上去不需要100个地址指针char* ch[100],只要一个,然后循环,循环每步像上面说的那样,动态分配内存,用完delete掉,下一步重新分配,如此下去
a
aaron
接近 3 年
8 楼
用 const_cast(s.data()) 应该可以吧。但是要保证这个s一直存在。
t
ts78
接近 3 年
9 楼
不知道你想说啥
C 里面 可任意动态生成字符串
你这个 接口不就是长度不限的字符串吗, 结尾为 null
有啥特别的地方
看起来 C++ 就是脱裤子放屁, 多此一举
忘掉 string
直接用 char* 写程序
【 在 minquan (三民主义) 的大作中提到: 】
: 第三方库的h文件是这么写的:
: virtual void RegisterIP(char *oneAddress) = 0;
: 我需要反复调用这个函数,把任意多个IP地址给注册上。
: 这样即使断线了,第三方库会自动尝试别的IP地址进行重连。
m
minquan
接近 3 年
10 楼
谢谢,我去试试。
【 在 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
接近 3 年
11 楼
别人教我这么写:
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
接近 3 年
12 楼
这个方法简单,确定是C++11的。因为之前不保证字符存储是连续的。
我的方法就是你写的方法的正确写法,但是需要copy。这个方法不需要copy。
另一个写法是
RegisterIP(&a.front());
【 在 minquan (三民主义) 的大作中提到: 】
: 别人教我这么写:
: RegisterIP(&a[0]);
: 这样就完成a的类型转换,这么做和你的方法的区别在什么?
s
sixpack
接近 3 年
13 楼
你和你的程序员都很菜
【 在 minquan (三民主义) 的大作中提到: 】
: 我司调用一个C++的金融接口,规定可以绑定多IP地址,但每个都必须是char*类型。程
: 序员告诉我说做不了。我自己试了试,好像还真不好做。
: 简化版:把一个句子中每个单词都保存为单独的char*变量。
: 最简单的:
: char* w1 = "Hello".data()
: 第三方函数(w1)
: char* w2 = "World".data()
: 第三方函数(w2)
: 以上代码的问题很明显,w1和w2是手动命名的,多个地址可未必是2个或者固定个,应
: 该在配置里可以改动。由于C++不支持自己拼接变量名,只能通过vector或array进行迂
: ...................
m
minquan
接近 3 年
14 楼
我本来就不是程序员。
然而我的程序员仗着自己是学这个的,经常冲我拍桌子。
【 在 sixpack (InGodWeTrustAllOthersWeMonitor) 的大作中提到: 】
: 你和你的程序员都很菜
b
bihai
接近 3 年
15 楼
教你这个写法的是同一个吗?
RegisterIP(&a[0]);
【 在 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
第三方库的h文件是这么写的:
virtual void RegisterIP(char *oneAddress) = 0;
我需要反复调用这个函数,把任意多个IP地址给注册上。
这样即使断线了,第三方库会自动尝试别的IP地址进行重连。
ch[0] = new char [a.size()];
得分配地址。
语法可能有错。就是动态分配地址。
这个接口不专业,应该加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地址进行重连。
你要搞清楚他们会对这个字符串做什么, 会改动吗?会 auto release 吗? 大概率不会, 是只读的, 好多 C 的程序都是这样的, 那样的话 可以用 c_str() cast 一下
就好了。
看起来这个接口的input是一个以零结尾的c string。你把字串拷贝到array中去后,要保证字串后跟着0。
这是很基本的c语言常识。
看上去不需要100个地址指针char* ch[100],只要一个,然后循环,循环每步像上面说的那样,动态分配内存,用完delete掉,下一步重新分配,如此下去
用 const_cast(s.data()) 应该可以吧。但是要保证这个s一直存在。
不知道你想说啥
C 里面 可任意动态生成字符串
你这个 接口不就是长度不限的字符串吗, 结尾为 null
有啥特别的地方
看起来 C++ 就是脱裤子放屁, 多此一举
忘掉 string
直接用 char* 写程序
【 在 minquan (三民主义) 的大作中提到: 】
: 第三方库的h文件是这么写的:
: virtual void RegisterIP(char *oneAddress) = 0;
: 我需要反复调用这个函数,把任意多个IP地址给注册上。
: 这样即使断线了,第三方库会自动尝试别的IP地址进行重连。
谢谢,我去试试。
【 在 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());
别人教我这么写:
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());
这个方法简单,确定是C++11的。因为之前不保证字符存储是连续的。
我的方法就是你写的方法的正确写法,但是需要copy。这个方法不需要copy。
另一个写法是
RegisterIP(&a.front());
【 在 minquan (三民主义) 的大作中提到: 】
: 别人教我这么写:
: RegisterIP(&a[0]);
: 这样就完成a的类型转换,这么做和你的方法的区别在什么?
你和你的程序员都很菜
【 在 minquan (三民主义) 的大作中提到: 】
: 我司调用一个C++的金融接口,规定可以绑定多IP地址,但每个都必须是char*类型。程
: 序员告诉我说做不了。我自己试了试,好像还真不好做。
: 简化版:把一个句子中每个单词都保存为单独的char*变量。
: 最简单的:
: char* w1 = "Hello".data()
: 第三方函数(w1)
: char* w2 = "World".data()
: 第三方函数(w2)
: 以上代码的问题很明显,w1和w2是手动命名的,多个地址可未必是2个或者固定个,应
: 该在配置里可以改动。由于C++不支持自己拼接变量名,只能通过vector或array进行迂
: ...................
我本来就不是程序员。
然而我的程序员仗着自己是学这个的,经常冲我拍桌子。
【 在 sixpack (InGodWeTrustAllOthersWeMonitor) 的大作中提到: 】
: 你和你的程序员都很菜
教你这个写法的是同一个吗?
RegisterIP(&a[0]);
【 在 minquan (三民主义) 的大作中提到: 】
: 我本来就不是程序员。
: 然而我的程序员仗着自己是学这个的,经常冲我拍桌子。