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

