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

C语言中拼接以?为结束符的字符串问题求助

关于es_cat函数的垃圾字符问题与直接拼接可行性解答

首先,咱们先聊聊你遇到的末尾垃圾字符问题——这大概率和缓冲区空间不足或者终止符处理不当有关,指针操作也可能是诱因,咱们逐一分析:

垃圾字符的根源分析

  1. 缓冲区空间不足:你提到调整cat_src数组长度后垃圾字符消失,这是最明显的信号。如果dst的缓冲区剩余空间不足以容纳src的全部有效字符(到?为止)加上最终的终止?,写入时就会越界到未初始化的内存区域,这些区域的随机数据就会被当成字符串的一部分输出,也就是你看到的垃圾字符。
  2. 终止符处理遗漏:如果你的代码在拼接完成后,没有在新的字符串末尾写入?,那么程序读取时会一直往后找?,直到碰到内存里随机存在的某个?或者其他不可控的字符,中间的垃圾数据自然就被带出来了。
  3. 指针定位错误:如果寻找dst末尾?的逻辑有问题(比如没找到正确的?就开始写入,或者跳过了某些字符),也可能导致写入位置偏移,进而越界访问垃圾内存。

能不能直接在dst上拼接?

当然可以!这其实是这类拼接函数的常规做法,前提是**dst指向的缓冲区有足够的剩余空间**(能装下src的所有有效字符 + 一个终止?)。给你一个标准的实现思路:

char *es_cat(char *dst, char *src) {
    // 第一步:定位到dst的终止符?位置(这是拼接的起始点)
    char *dst_ptr = dst;
    while (*dst_ptr != '?') {
        // 这里建议加个缓冲区边界检查,防止dst没有?导致无限循环
        dst_ptr++;
    }

    // 第二步:复制src的内容,直到遇到?
    char *src_ptr = src;
    while (*src_ptr != '?') {
        *dst_ptr = *src_ptr;
        dst_ptr++;
        src_ptr++;
        // 同样要检查dst是否还有剩余空间,避免溢出
    }

    // 第三步:添加新的终止符?
    *dst_ptr = '?';

    return dst;
}

这个实现就是直接在dst上操作:先找到dst的?,覆盖它开始写src的内容,最后补个?作为新的终止符,完全不需要额外缓冲区。

额外建议

  • 一定要在代码里加入缓冲区边界检查,比如提前计算dst剩余空间和src需要的空间,避免溢出——未定义行为的bug排查起来会非常头疼。
  • 测试时可以打印出dst的缓冲区地址和各指针位置,确认写入没有越界,这能快速定位指针操作的问题。

内容的提问来源于stack exchange,提问作者runninoutofheap

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:19:30