从函数返回的C++问题
C++ problems returning from a function
我制作了一个供个人使用的服务器应用程序,但当客户端断开连接时,我总是会遇到问题。我最近才意识到,这是由于recv
函数返回的项没有被正确识别造成的。例如:
char* mrecv(bool show, LPVOID pointerToObject) //Recieve a message
{
int iResult2 = recv(ClientSocket, recvbuf, 512, 0);
if (iResult2 > 0) {
if ((strncmp(recvbuf,"/",1)) != 0) {
printm(recvbuf, pointerToObject);
}
else if (iResult2 == 0) {
printf("Connection closing...n");
closesocket(ClientSocket);
WSACleanup();
return "1";
}
else {
printm("recv failed with error: %dn", WSAGetLastError());
printm("Client must have disconnected. Please select a new client.");
return "1";
}
return recvbuf;
}
当客户端断开连接时,函数将正确地向父函数返回"1"。然而,当我这样检查时…:
DWORD WINAPI recvfunc(LPVOID pointerToObject)
{
while (true) {
ClientSocket=client[currentclient].cs;
char* p = mrecv(true, pointerToObject);
std::cout<<p<<"n";
if ( p == "1") {
client[currentclient].con=false;
ClientSocket=client[lastclient].cs;
return 1;
}
}
return 0;
}
无论检查是否返回"1"
,if
语句都返回false,但是1
完美地打印到屏幕上。
有人知道为什么会发生这种事吗?
如果你没注意到的话,我在用winsock。
提前感谢:)
编辑::截至本次编辑,以下所有答案似乎都是一样的,它们都解决了问题。如果你看看上面列出的第一个函数^,你会发现我以前甚至遇到过这个问题,不得不使用这个解决方案。所以看起来我的大脑有点放弃了我。无论如何,谢谢你的帮助。:)
您的mrecv
返回类型为char*
的结果。
您的比较:
if (mrecv(true, pointerToObject)=="1")
是指针比较,而不是字符串比较。只有当字符串"1"
的两个实例碰巧存储在同一地址时,这才是真的。
要比较字符串,请使用strcmp
函数。或者,由于您使用的是C++,请考虑使用std::string
类(它有一个重载的==
函数来进行字符串比较),而不是使用原始的C样式字符串。
尝试:
if (strcmp(mrecv(true, pointerToObject), "1") == 0)
您返回的是指向只读字符文本的指针,这些地址在进行比较时是不可靠的。
您可以使用strcmp或任何其他C++字符串比较进行字符串比较
if ( strcmp(p,"1") == 0) { ...
您正在比较字符指针,不能保证一个指针与另一个指针相等:
试试这个:
if (mrecv(true, pointerToObject)[0] == '1')
现在,您正在将mrecv
返回的第一个字节与字符1
进行比较。
但是,我强烈建议您返回整数返回代码,而不是字符。
您的问题是,不能以这种方式将==运算符用于C样式字符串(char数组),因为要比较的不是字符串的内容,而是指向第一个字符的指针的值,因为您实际上是在比较char*和char*。如果你想比较实际值,你需要取消引用返回的指针,并将其与字符值而不是字符串进行比较(单引号而不是双引号):
if (*mrecv(true, pointerToObject) == '1') {
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- C++格式化输出问题
- 使用mongocxx驱动程序时包含头文件问题