将 vector<char> 复制到 char*

Copy vector<char> into char*

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

你可以这样做:

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] = '[=10=]';

buffer.clear();

首先,通过赋值c = new char[buffer.size()];

为数据分配space

然后用memcpy复制数据:memcpy(c, buffer.data(), buffer.size())

您的 for 循环也可以代替 memcpy

另请注意,如果在使用 char*vector<char> 始终保持原位,并且您可以更改向量的内容,则可以简单地使用向量后面的数据用一个简单的赋值,像这样:

char *c = buffer.data();

I'm noticing some weird behavior when I create my char* of the given size is that it creates it bigger with some random "hereýýýý««««««««" values after my word

看来您确实需要一个以 null 结尾的 C 字符串。在这种情况下,您需要在末尾分配一个额外的字符,并将其设置为零:

char *c = new char[buffer.size()+1];
memcpy(c, buffer.data(), buffer.size());
c[buffer.size()] = 0;

我能想到的最简单的方法是;

 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() 可用于标准 header <algorithm>.

这假定将数据放入 buffer 的代码明确负责将任何值为零 ('[=16=]') 的尾随字符插入缓冲区。否则,c 的后续使用不能假定存在 '[=16=]' 终止符。

如果要确保尾随 '[=16=]' 存在于 c 中,即使 buffer 不包含尾随 '[=16=]',那么一种方法是;

 std::vector<char> buffer;
   // some code that places data into buffer
 char *c = new char[buffer.size() + 1];    // additional room for a trailing '[=11=]'
 std::copy(buffer.begin(), buffer.end(), c);
 c[buffer.size()] = '[=11=]';
    // 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('[=12=]');    // if we need to ensure a trailing '[=12=]'
 char *c = &v[0]

    // use c like a normal array of char

只要使用 c 的代码不执行任何会调整 v 大小的操作,在这种情况下 c 的用法与前面的示例完全相同。这样做的好处是 v 在超出范围时会被释放(不需要记住 delete 任何东西),但潜在的缺点是 c 在那之后不能使用(因为它将是一个悬挂指针)。