【问题标题】:char Array to string conversion results in strange characters - socketschar 数组到字符串的转换导致奇怪的字符 - 套接字
【发布时间】:2013-08-12 18:07:16
【问题描述】:

我目前有以下代码

char my_stream[800];
std::string my_string; 
iResult =  recv(clntSocket,my_stream,sizeof(my_stream),0);
my_string = std::string(my_stream);

现在,当我尝试将 char 数组转换为字符串时,我得到了字符串中奇怪字符的存在,任何关于我可能做错的建议

【问题讨论】:

  • tick_stream 是什么? my_string 是您要重新分配的字符数组?
  • 刚刚更新了代码。需要将char数组转换为字符串

标签: c++ sockets client-server


【解决方案1】:

你得到奇怪的字符,因为你的字符串长度不等于收到的字节数。

你应该像这样初始化字符串:

char* buffer = new char[512];

ssize_t bytesRead = recv(clntSocket,buffer,512,0);

std::string msgStr = std::string(buffer,bytesRead);

delete buffer;

最常见的解决方案是在读取任何内容之前将缓冲区的每个字节归零。

char buffer[512];
buffer = { 0 };

【讨论】:

  • 一定要先检查bytesRead的实际值。出错时为-1,断开连接时为0
【解决方案2】:

如果您正在从套接字读取以零结尾的字符串,则无需进行转换,它已经是 char 字符串。如果它不是零终止的,那么您将需要某种其他类型的终止符,因为套接字是流(假设这是 TCP)。换句话说,你不需要my_string = std::string(my_stream);

【讨论】:

  • 传入的字符串可能包含'\n',我希望它出现在结果字符串中
  • 好的,你得到的iResult是收到的长度......你可以通过my_stream[iResult] = 0;来零终止它但是你需要确保你有空间容纳额外的0“字符“......你可以这样做:recv(clntSocket,my_stream,sizeof(my_stream)-1,0);
【解决方案3】:

您是否尝试过直接打印 my_stream 而不转换为字符串。 根据我的说法,发送和接收的数据格式可能不匹配。 另一端的数据可能是其他格式,如 Unicode,您可能正在尝试将其打印为单字节数组 如果只有字符串的一部分是奇怪的字符,那么它肯定是与 my_stream 末尾的空终止符相关的错误,缺少 tehn 会增加 my_stream 数组的大小。

【讨论】:

    猜你喜欢
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    • 1970-01-01
    • 2012-07-25
    相关资源
    最近更新 更多