[英]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];
}
我能想到的最簡單的方法是:
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
在該點之后不能再使用(因為它將是一個懸空的指針)。
首先,通過分配c = new char[buffer.size()];
為數據分配空間c = new char[buffer.size()];
然后使用memcpy
復制數據: memcpy(c, buffer.data(), buffer.size())
您的for
循環也可以代替memcpy
起作用。
還要注意,如果在使用char*
時vector<char>
始終保持在原位,並且允許您更改vector的內容,則可以通過簡單的分配簡單地使用vector后面的數據,如下所示:
char *c = buffer.data();
當我創建給定大小的char *時,我注意到一些怪異的行為,即它使我的單詞后面帶有一些隨機的
"hereýýýý««««««««"
值而使它變大
看來您確實需要一個以N結尾的C字符串。 在這種情況下,您需要在末尾分配一個額外的字符,並將其設置為零:
char *c = new char[buffer.size()+1];
memcpy(c, buffer.data(), buffer.size());
c[buffer.size()] = 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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.