2012-09-11 201 views
2

我見過很多類似的問題,但似乎沒有任何工作可以用於我的代碼,我想我忽略了一些基本的東西,也許你可以提供幫助。將std :: string轉換爲char數組

現在我正在構造一個字符串作爲請求發送到winsock發送函數,它需要發送一個char []。我需要將我的std :: string轉換爲char數組(char [])。

目前,這是工作的要求:

char request [] = "GET /gwc/cgi-bin/fc?client=udayton0.1&hostfile=1HTTP/1.0\nHost:www.gofoxy.net\n\n"; 

但我需要改變,以相同的數據結構的請求的字符串。

我感謝任何幫助!

編輯

我可以將字符串轉換爲char *,但我怎麼可以用它來獲得一個 字符數組?我希望我不會讓它更混亂。這裏有 兩家生產焦炭明星的時候我跑不與發送 要求兼容的嘗試:

//convert request into a char[] 
//char *req_ch = new char[req_str.size()+1]; 
//hostCh[req_str.size()] = 0; 
//memcpy(req_ch, req_str.c_str(), req_str.size()); 

//char * req = new char[req_str.size() +1]; 
//std::copy(req_str.begin(), req_str.end(), req); 
//req[req_str.size()] = '\0'; 
+3

是不是'c_str()'你在找什麼,它返回一個指針? –

+0

那麼一個非const字符數組的字符串?我會用一個用迭代器構造的vector來使用'vector :: data()'。 – chris

+1

@gosly,一個數組在傳入函數時會衰減爲一個指針,所以傳遞一個指針並不重要。 – chris

回答

2

你真的需要char[]或將char const*嗎?

如果是後者,c_str()會做你想做的。

如果是前者,那麼你就需要將字符串複製到的東西,你想要做什麼:

std::vector<char> buff(str.size() + 1); // initializes to all 0's. 
std::copy(str.begin(), str.end(), buff.begin()); 
fun_call(&buff[0]); 

有機會,你只需要c_str版本。如果你需要這個第二版本,那麼你正在閱讀,可能希望提供一個最大的buff大小。

+0

只需用'str.begin(),str.end()'(或'std :: begin'和'std :: end')構造向量。自C++ 11以來,它也有'data()',這是爲了訪問指針。 – chris

+0

如果需要追加'\ 0',哪個更快,會很有趣。對兩者的改進可能是使用str.c_str(),str.c_str()+ str.size + 1。 –

7

如果你有一些遺留的C風格的API,像這樣的簽名,它期待一個空結尾的C風格的字符串:

void foo(const char* data); 

,那麼你通常可以這樣做:

std::string s("my string data"); 
foo(s.c_str()); 

如果你真的需要一個數組或數據的非const版本,這樣API是這樣的:

void foo(char* data, std::size_t len); // or foo(char[] data, std::size_t len); 

然後你可以這樣做:

std::string s("my string data"); 
std::vector<char> v(s.begin(), s.end()); 
foo(&v[0], v.size()); // or foo(v.data(), v.size()); in C++11 
相關問題