将char *转换为字符串后的编码更改

时间:2014-02-28 03:40:38

标签: c++

我正在使用以下代码从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我得到了另一个带有西里尔符号的字符串。

你能帮我解决一下吗?

3 个答案:

答案 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);