我只是在学习C和C ++编程。
我已经搜索过,似乎无法找到一个反应良好的答案。当然使用<string>
要容易得多,但是对于这个任务,我只需要使用clib <string.h>
函数;我也不允许使用C ++ 11函数。
我有以下2个变量,并希望将buffer
的内容移至c
。
vector<char> buffer;
char* c = "";
我怎样才能轻松完成这项工作?
到目前为止,我有这个,但它显然不起作用,否则我不会在这里。
for (int b = 0; b < buffer.size(); b++)
{
c += &buffer[b];
}
答案 0 :(得分:3)
我能想到的最简单的方法是;
std::vector<char> buffer;
// some code that places data into buffer
char *c = new char[buffer.size()];
std::copy(buffer.begin(), buffer.end(), c);
// use c
delete [] c;
std::copy()
在标准标题<algorithm>
中可用。
这假定将数据放入buffer
的代码明确地负责将值为零('\0'
)的任何尾随字符插入缓冲区。如果没有这个,c
的后续使用不能假定存在'\0'
终结符。
如果您想确保'\0'
中存在c
,即使buffer
不包含 std::vector<char> buffer;
// some code that places data into buffer
char *c = new char[buffer.size() + 1]; // additional room for a trailing '\0'
std::copy(buffer.begin(), buffer.end(), c);
c[buffer.size()] = '\0';
// use c
delete [] c;
,则可以采用一种方法;
std::vector<char> container;
// some code that places data into buffer
std::vector<char> v(container); // v is a copy of container
v.push_back('\0'); // if we need to ensure a trailing '\0'
char *c = &v[0]
// use c like a normal array of char
一个人也可能偷偷摸摸地使用另一个向量;
c
只要使用v
的代码不执行任何会调整c
大小的内容,在这种情况下v
的使用与前面的示例完全相同。这样做的好处是delete
在超出范围时将被释放(无需记住c
任何东西)但是在此之后select a.bzq_terminate_provider, a.callsnum, a.at_call_dur_sec, sum_charge
From (select * from usage_cycle_sum
where ban='80072922' and ben='1'
and subscriber_no='036585305'
and start_cycle_code ='20150207'
and feature_code_rank='1') a, (select bzq_terminate_provider,sum(charge_amount) as sum_charge from usage_cycle_sum
where ban='80072922' and ben='1'
and subscriber_no='036585305'
and start_cycle_code ='20150207' group by bzq_terminate_provider) b
where a.bzq_terminate_provider=b.bzq_terminate_provider
无法使用的潜在劣势(从那时起)它将是一个悬垂的指针)。
答案 1 :(得分:2)
首先,通过分配c = new char[buffer.size()];
然后使用memcpy
复制数据:memcpy(c, buffer.data(), buffer.size())
您的for
循环也可以取代memcpy
。
另请注意,如果vector<char>
在您使用char*
时始终保持原位,并且您可以更改向量的内容,则只需使用向量后面的数据即可简单的任务,如下:
char *c = buffer.data();
当我创建给定大小的char *时,我注意到一些奇怪的行为是它在我的单词之后用一些随机的
"hereýýýý««««««««"
值创建它更大
看起来你确实需要一个以null结尾的C字符串。在这种情况下,您需要在末尾分配一个额外的字符,并将其设置为零:
char *c = new char[buffer.size()+1];
memcpy(c, buffer.data(), buffer.size());
c[buffer.size()] = 0;
答案 2 :(得分:0)
你可以这样做:
vector<char> buffer;
//I am assuming that buffer has some data
char *c = new char[buffer.size()+1];
for( int i=0; i<buffer.size(); i++ )
c[i] = buffer[i];
c[i] = '\0';
buffer.clear();