C++ 将char*转换为字符串后的编码更改
我正在使用以下代码从套接字读取字符[]:C++ 将char*转换为字符串后的编码更改,c++,C++,我正在使用以下代码从套接字读取字符[]: 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 *tem
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
中,我得到了另一个带有西里尔字母符号的字符串
你能帮我解决吗?你的
szResponse
是堆栈上的一个局部变量。您正在返回一个指向局部变量的指针,当您取消引用该指针时,您将获得未定义的行为,因为一旦函数退出,该内存将不再有效
一种解决方案是将成员函数改为返回std::string
另外,请确保编译时使用了高警告级别,因为我确信大多数编译器都会对此发出警告。尝试:
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);
或:
尽管Jesse的答案是最好的,但最简单的解决方案是将缓冲区更改为
static
storage duration,以便它在函数调用后保持不变
static char szResponse[50];
尽管最佳实践是始终初始化变量,但您可能不会使用szResponse
编写初始值设定项。无论如何它都会被归零,“
误导性地使它看起来存储了一个字符串,而实际上它并没有。请注意,recv
不是一个基于字符串的函数,并且它没有添加NUL终止符,因此您应该自己手动添加。否则,printf
可能会导致缓冲区溢出。(如果您直接接收到std::string
的底层缓冲区中,则无需执行此操作)
另外,static
实现一个全局变量,此解决方案将使receive\u msg
不可重入。无法从两个线程同时调用它
完全避免使用C字符串和缓冲区而使用
std::string
无疑是最好的解决方案。您返回的是指向不再存在的对象的指针。szResponse
数组仅在运行receive_msg
时存在,因此返回指向它的指针毫无意义。-1,除了由string
管理的缓冲区之外,还有一个单独拥有的缓冲区有什么意义?(“它无论如何都会归零”仅当声明为static
时才适用。现在我看到,由于recv
不修改消息之外的字节,局部变量初始化确实添加了空终止符,但是如果接收到50个字节,缓冲区溢出仍然可能发生。最好在recv
之后显式写入NUL)
static char szResponse[50];