You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何拼接两个char指针?含UDP套接字场景代码示例

拼接char指针的可行方案及UDP场景适配

先看你给出的第一段代码的问题

你的这段代码存在几个明显问题,导致它不可行:

  1. 第一个for循环里i++重复执行——循环头里有i++,赋值语句里又写了newPart[i++],会跳过一半字符,最终只拷贝partOne里的第0、2...位内容。
  2. 拼接后的newPart没有添加字符串终止符'\0',用cout输出时会读取内存里的垃圾数据,直到碰到随机的'\0',属于未定义行为。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 22:53:15