我像往常一样定义了我的char,尽管我将其命名为buf
。我一直收到错误:
类型' char'的参数与' void *'
类型的参数不兼容
如果我将buf
设置为void*
,则无法将4096作为参数传递。
那么,我该如何解决这个问题呢?有没有人遇到这样的问题?
char buf{4096};
string userinput;
do
{
cout << "> " << endl;
getline(cin, userinput);
if (userinput.size() > 0) // make sure the user typed something in
{
int SendResult = send(sock, userinput.c_str, userinput.size() + 1, 0);
if (SendResult != SOCKET_ERROR)
{
ZeroMemory(buf, 4096);
int bytesReceived = recv(sock, buf, 4096, 0);
if (bytesReceived > 0)
{
cout << "SERVER" << string(buf, 0, bytesReceived) <<
endl;
}
}
}
答案 0 :(得分:5)
问题很可能是这个定义:
char buf{4096};
大致相当于:
char buf = 4096;
哪个是单个字符,而不是字符数组缓冲区。解决这个问题:
char buf[4096];
当你传递它时可能需要这样做:
ZeroMemory(&buf, 4096);
我强烈建议你避免在任何地方敲击4096,所以定义一个常数:
const SIZE_T buf_size = 4096;
char buf[buf_size];
// ...
ZeroMemory(&buf, buf_size);
答案 1 :(得分:0)
怎么样:
#include <array>
std::array<char, 4096> buf;
...
std::fill(buf.begin(), buf.end(), 0);
int bytesReceived = recv(sock, buf.data(), buff.size(), 0);
...
答案 2 :(得分:0)
另一个问题是为什么你需要ZeroMemory
。我认为这里发生的是你选择了错误的字符串构造函数重载。让我解释一下:
您拥有buf
缓冲区并且拥有bytesReceived
长度的数据,所以您真正需要的只是
std::string(buf, bytesReceived)
构造有效的字符串。但是你选择了
std::string(buf, 0, bytesReceived)
此重载如下所示:
basic_string(const basic_string&amp; other, size_type pos, size_type计数, ..
buf
在第一个参数处隐式转换为std::string
,但为了使其正常工作,您的缓冲区需要以空终止,它可能是也可能不是。所以你通过将剩余的缓冲区归零来解决这个问题。如果您获得4096字节的非空终止数据,您认为会发生什么?在这种情况下,您的解决方法将无效。因此,只需使用上面提到的相应字符串构造函数,您就不需要使用ZeroMemory
。