2012-09-11 103 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 
相关问题