我见过很多类似的问题,但似乎没有一个问题适用于我的代码,我想我忽略了一些基本的东西,也许你可以提供帮助。
现在我正在构建一个字符串,作为对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 *,但是如何使用它来获取a 字符数组?我希望我不会让它更加混乱。这是 两次尝试产生与发送不兼容的char star 我跑的时候请求:
//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';
答案 0 :(得分:8)
如果您有一些具有此类签名的旧式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
答案 1 :(得分: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。