如何拼接两个char指针?含UDP套接字场景代码示例
拼接char指针的可行方案及UDP场景适配
先看你给出的第一段代码的问题
你的这段代码存在几个明显问题,导致它不可行:
- 第一个for循环里
i++重复执行——循环头里有i++,赋值语句里又写了newPart[i++],会跳过一半字符,最终只拷贝partOne里的第0、2...位内容。 - 拼接后的
newPart没有添加字符串终止符'\0',用cout输出时会读取内存里的垃圾数据,直到碰到随机的'\0',属于未定义行为。 char newPart[N+M];是C语言的变长数组特性,C++标准并不支持,只有部分编译器(比如GCC)作为扩展兼容,移植性极差。
正确的char指针拼接方法
分两种场景处理:
场景1:拼接C风格字符串(带'\0'终止符)
如果partOne和partTwo是标准C字符串,正确实现如下:
const char* partOne = "1234"; const char* partTwo = "5678"; // 计算两个字符串的有效长度(不含终止符) size_t N = strlen(partOne); size_t M = strlen(partTwo); // 动态分配内存,预留终止符位置 char* newPart = new char[N + M + 1]; // 拷贝第一部分字符串 memcpy(newPart, partOne, N); // 拷贝第二部分到第一部分末尾 memcpy(newPart + N, partTwo, M); // 添加字符串终止符 newPart[N + M] = '\0'; std::cout << newPart << std::endl; // 使用完毕后释放内存 delete[] newPart;
也可以用C标准库的malloc/free实现,逻辑完全一致。
场景2:拼接二进制数据(比如UDP接收的字节流)
如果是UDP场景下的字节数据(不一定是字符串,无'\0'终止符),只需按字节拷贝即可:
char* partOne = ...; // 已接收的N字节数据 char* partTwo = ...; // 新接收的M字节数据 // 动态分配足够容纳所有字节的内存 char* combinedBuffer = new char[N + M]; // 拷贝第一部分数据 memcpy(combinedBuffer, partOne, N); // 拷贝第二部分到缓冲区末尾 memcpy(combinedBuffer + N, partTwo, M); // 后续处理combinedBuffer,使用完毕记得释放内存 delete[] combinedBuffer;
适配你的UDP部分消息处理场景
UDP接收逻辑里,更合理的方式是维护一个累积缓冲区存储未完成的消息,而非每次临时拼接。调整后的核心逻辑如下:
while(!closed){ int bytesReceived = myApi.readData(); if(bytesReceived <= 0){ continue; } char* buffer = myApi.getBuffer(); if(startOf(buffer)){ int messageLen = getMessageLength(buffer); // 分配存储完整消息的缓冲区 char* fullMessage = new char[messageLen]; // 先将当前收到的字节拷贝到缓冲区 memcpy(fullMessage, buffer, bytesReceived); int totalReceived = bytesReceived; // 循环接收剩余消息内容 while(totalReceived < messageLen){ int partialBytes = myApi.readData(); if(partialBytes <= 0) continue; char* partialBuffer = myApi.getBuffer(); // 将新收到的部分追加到累积缓冲区的对应位置 memcpy(fullMessage + totalReceived, partialBuffer, partialBytes); totalReceived += partialBytes; } // 处理完整消息 processFullMessage(fullMessage, messageLen); // 释放缓冲区内存 delete[] fullMessage; } // 注意:原代码的do-while循环条件`*buffer != '\0'`不适合UDP场景——UDP数据不一定是字符串,建议根据协议调整循环逻辑 }
关键注意点:
- 不要直接拼接临时的
char*,而是维护固定大小的累积缓冲区,每次将新数据追加到末尾。 - 务必根据消息长度动态分配缓冲区,避免内存浪费或溢出。
- UDP可能出现丢包、乱序,需额外处理异常场景(比如超时未收满数据时释放缓冲区,防止内存泄漏)。
内容的提问来源于stack exchange,提问作者Recursive
相关产品推荐
相关产品推荐

