字符串不是null终止错误
String is not null terminated error
我有一个字符串不是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) + 1
。next_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
,无论您喜欢什么。
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 我收到以下错误:抛出'std::bad_alloc'实例后终止调用
- C++应用程序 MySQL odbc 数据库连接错误:在引发"otl_tmpl_exception<>"实例后终止调用
- 当客户端在 write() 期间终止连接时,由对等套接字错误重置连接
- 在抛出 'std::runtime_error' 的实例后终止调用 what(): Filebuf 和 ostream 的 I/O 错误
- 这是我的 .h 文件的一些错误,当我在其中包含我的类模板时,它显示 [错误] 未终止 #ifndef
- 当可以返回错误/异常时,从库中终止调用程序(例如,调用exit())是否总是错误的?
- 获取错误:在抛出"std::bad::alloc"的实例后终止调用 what(): std::bad_alloc
- 编译Qt项目,得到错误QQmlEngine:没有这样的文件或目录编译终止
- C++终止错误'std::bad_alloc'
- "if (argc < 2 || argc > 2)"应该有 2 个参数吗?&终止在抛出'std::out_of_range'错误实例后调用
- 在抛出 'std::invalid_argument' 的实例后调用终止 what(): stoi 错误 in leet
- 引发"char const*"错误的实例后调用的终止
- 数组下标编译的无效类型'int[int]'由于 -Wfatal 错误而终止
- 引发实例后终止调用 - C++错误
- 致命错误:opencv2/core.hpp:opencv4 中没有此类文件或目录编译终止
- Node-ffi 绑定到 NULL 终止的 C 字符串数组,但得到“分段错误:11”
- 字符串不是null终止错误
- Winsock UDP文件终止错误10040
- c++ req-rep终止错误