将 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
在那之后不能使用(因为它将是一个悬挂指针)。
我正在学习 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()];
然后用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
在那之后不能使用(因为它将是一个悬挂指针)。