将vector <char>复制到char *

时间:2015-06-07 12:27:19

标签: c++ vector char c-strings

我只是在学习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];
}

3 个答案:

答案 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();
相关问题