3

我见过很多类似的问题,但似乎没有一个对我的代码有用,我想我忽略了一些基本的问题,也许你可以帮忙。

现在我正在构建一个字符串,作为一个请求发送到 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';
4

2 回答 2

8

如果你有一些带有这样签名的遗留 C 风格 API,它期望一个空终止的 C 风格字符串:

void foo(const char* data);

那么您通常可以执行以下操作:

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

如果你真的需要一个数组,或者一个非常量版本的数据,那么 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
于 2012-09-11T02:05:55.233 回答
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 最大尺寸。

于 2012-09-11T01:56:48.840 回答