我正在使用以下代码从socket读取char []:
char* Beam::receive_msg()
{
char szResponse[50] = "";
int retVal = recv(clientSocket, szResponse, 50, 0);
...
printf("Got the response from server\n%s\n",szResponse);
return szResponse;
}
char *temp = receive_msg();
string msg = string(temp);
我在temp
得到了我想要的消息 - “(0.1,0.1)”,但在string msg
我得到了另一个带有西里尔符号的字符串。
你能帮我解决一下吗?
答案 0 :(得分:2)
您的szResponse
是堆栈上的局部变量。您正在返回一个指向局部变量的指针,当您取消引用该指针时,您将获得未定义的行为,因为该函数退出后该内存不再有效。
一种解决方案是更改您的成员函数以返回std::string
。
另外,请确保您正在使用高警告级别进行编译,因为我非常确定大多数编译器会对此发出警告。
答案 1 :(得分:1)
尽管Jesse的答案是最好的,但最简单的解决方案是将缓冲区更改为static
存储持续时间,以便在函数调用后它仍然存在。
static char szResponse[50];
虽然最佳做法是始终初始化变量,但您可能不会使用szResponse
编写初始值设定项。无论如何它都会归零,而""
误导性地导致它看起来存储一个字符串,而它却没有。请注意,recv
不是基于字符串的函数,并且它不会添加NUL终止符,因此您应该自己手动执行此操作。否则printf
可能导致缓冲区溢出。 (如果直接接收std::string
的基础缓冲区,则无需这样做。)
此外,static
实现了一个全局变量,此解决方案将使receive_msg
不可重入。它无法从两个线程同时调用。
完全避免使用std::string
的C字符串和缓冲区绝对是最佳解决方案。
答案 2 :(得分:-1)
尝试:
char* Beam::receive_msg()
{
char szResponse = new char[50];
int retVal = recv(clientSocket, szResponse, 50, 0);
...
printf("Got the response from server\n%s\n",szResponse);
return szResponse;
}
char *temp = receive_msg();
string msg = string(temp);
delete(temp);
或者:
void Beam::receive_msg(char *szResponse)
{
int retVal = recv(clientSocket, szResponse, 50, 0);
...
printf("Got the response from server\n%s\n",szResponse);
}
char temp[50];
receive_msg(temp);
string msg = string(temp);