字符串不是null终止错误

String is not null terminated error

本文关键字:终止 错误 null 字符串      更新时间:2023-10-16

我有一个字符串不是null终止的错误,尽管我不完全确定原因。在代码的第二部分中使用std::string是我试图解决这个问题的一种方法,尽管它仍然不起作用。

我最初的代码只是使用缓冲区并将所有内容复制到client_id[]中。发生的错误超过。如果错误是正确的,那就意味着我有client_id或者Buffer没有null终止符。我很确定client_id是好的,因为我可以在调试模式下看到它。奇怪的是缓冲区也有一个null终止符。不知道出了什么问题。

char * next_token1 = NULL;
char * theWholeMessage = &(inStream[3]);
theTarget = strtok_s(theWholeMessage, " ",&next_token1);
sendTalkPackets(next_token1, sizeof(next_token1) + 1, id_clientUse, (unsigned int)std::stoi(theTarget));

内部sendTalkPackets是。我得到一个字符串不是null,终止于最后一行。

void ServerGame::sendTalkPackets(char * buffer, unsigned int buffersize, unsigned int theSender, unsigned int theReceiver)
{
std::string theMessage(buffer);
theMessage += "0";
const unsigned int packet_size = sizeof(Packet);
char packet_data[packet_size];
Packet packet;
packet.packet_type = TALK;
char client_id[MAX_MESSAGE_SIZE];

char theBuffer[MAX_MESSAGE_SIZE];
strcpy_s(theBuffer, theMessage.c_str());
//Quick hot fix for error "string not null terminated"
const char * test = theMessage.c_str();
sprintf_s(client_id, "User %s whispered: ", Usernames.find(theSender)->second.c_str());
printf("This is it %s ", buffer);
strcat_s(client_id, buffersize , theBuffer);

我认为问题在于这一行:

sendTalkPackets(next_token1, sizeof(next_token1) + 1, id_clientUse, (unsigned int)std::stoi(theTarget));

sizeof(next_token1)+1总是给出5(在32位平台上),因为它返回的是指针的大小,而不是字符数组的大小。

可能导致此(或其他问题)的一件事:buffersize,您通过sizeof(next_token1) + 1next_token1为指针,其将具有(通常)4或8的恒定大小。你几乎可以肯定地想要CCD_ 4。(或者可能没有+ 1;像这样传递大小的约定通常只包括如果CCD_ 6是输出缓冲器。还有其他几个您使用sizeof的地方,可能会出现类似的问题。

但最好重做整个逻辑以使用std::string,而不是所有这些C例程。不担心缓冲区大小和CCD_ 9终结符。(对于协议缓冲区,我还找到了std::vector<char>std::vector<unsigned char>非常有用。这是在std::string中的内存保证是连续的,但即使在今天,它似乎也更加对应与我正在处理的抽象概念非常接近。)

你不能只做

std::string theMessage(buffer);
theMessage += "0";

这在两个方面都失败了:

  • 如果buffer不是0终止的,那么std::string构造函数不知道buffer在哪里结束。因此,theMessage可能是垃圾,并包括随机的东西,直到在缓冲区之外的内存中找到一些零字节
  • 将字符串"0"附加到theMessage没有帮助。您想要的是在某个位置放置一个零字节,而不是值0x30(这是用于显示零的ascii代码)

解决此问题的正确方法是在缓冲区的起始位置之外插入一个文字零字节buffersize插槽。在buffer本身中不能做到这一点,因为buffer可能不够大,无法容纳额外的零字节。一种可能性是:

char *newbuffer = malloc(buffersize + 1);
strncpy(newbuffer, buffer, buffersize);
newbuffer[buffersize] = 0; // literal zero value

或者,您可以构造一个std::string,无论您喜欢什么。

相关文章: