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

C语言使用string.h库strncat拼接字符串出现乱码问题求助

问题产生原因
  • 核心原因是strcat/strncat函数的运行逻辑要求目标参数必须是合法的以'\0'结尾的C字符串:这两个函数都会先遍历目标字符串,找到'\0'结束符的位置,再从该位置开始追加新内容。
  • 你的代码中仅给output数组的前两个元素赋值为'<',既没有在main中初始化output数组,也没有在赋值完两个'<'后手动添加'\0'结束符。栈上分配的局部数组默认是未初始化状态,填充的是内存中的随机垃圾值,strncat执行时会从output起始位置向后寻找随机出现的'\0',导致output开头的随机垃圾值被保留,最终输出出现乱码。
  • 而你手动写的while循环是直接从下标2的位置开始写入word的内容,直接覆盖了output数组对应位置的随机值,后续拼接">>"后内容是连续合法的,因此输出正常。
修复方案

有两种常见的修复方式,任选其一即可:

  1. 手动在两个<后添加字符串结束符,保证strncat能找到正确的追加起始位置:
char *bracket_by_len(char *output, char *word, int length)
{
    if(strlen(word) < 5) {
        output[0] = '<';
        output[1] = '<';
        output[2] = '\0'; // 新增这行,标记当前字符串结束位置
        strncat(output, word, strlen(word));
        strcat(output, ">>");
        return output;
    }
    // 其余逻辑省略
}
  1. 在main函数中定义output数组时直接初始化,清空数组内的随机垃圾值:
int main()
{
    char word[40], output[40] = {0}; // 初始化output为全0
    printf("%s \n", bracket_by_len(output, "word", 20));
    return 0;
}

额外注意点:

  • 调用字符串拼接类函数前,一定要确认目标缓冲区的剩余空间足够容纳待拼接的内容,避免缓冲区溢出风险。
  • 所有C字符串操作都要确保操作对象是以'\0'结尾的合法字符串,否则会出现未定义行为。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:48:01