我正在制作一个游戏,其中的节目自动广播用户是在线的。广播信息将由以下内容组成:
前5个字节存储在char buf_begin中,而用户名存储在std::string username中。
我试过这个:
std::string buf_begin_s(buf_begin);
std::string buf = buf_begin_s + username;
sendto(udp_br, buf.c_str(), sizeof(buf.c_str()), 0, (sockaddr *)&to, sizeof(to));问题是buf字符串不包含1-5。字节,只有用户名。
发布于 2016-07-21 11:01:19
std::string buf_begin_s(buf_begin);如果像您所说的那样,buf_begin是一个5个字符的缓冲区,并且第一个字符可以是0,那么当它是0时,buf_begin_s最终是一个空字符串。此构造函数需要一个以'\0'字符终止的C样式字符串。如果buf中的第一个字符是0字节,这将是故事的结尾。
如果缓冲区中的5个字符中没有一个为0,则会导致未定义的行为,因为构造函数在内存中前进,寻找'\0'字节。
这可能应该是:
std::string buf_begin_s(buf_begin, buf_begin+5);sendto()调用也是错误的:
sendto(udp_br, buf.c_str(), sizeof(buf.c_str()), 0, (sockaddr *)&to, sizeof(to));由于buf.c_str()是const char *,第三个参数将是sizeof(const char *),或者4或8,这取决于这是32位平台还是64位平台。无论buf中有多少,sizeof(buf.c_str())总是4或8,这显然是错误的。
这应该是简单的buf.size()。
https://stackoverflow.com/questions/38502113
复制相似问题