由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - C++能实现动态存储char*吗?
进入Programming版参与讨论
1 (共1页)
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]);

1 (共1页)
进入Programming版参与讨论