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];